jni使用基础(八)之jni使用流程及C调用java简单说明

31 篇文章 0 订阅
21 篇文章 0 订阅

 

jni使用步骤:

1.定义好native接口。

2.使用javah工具,生成头文件。

3.根据头文件,创建c文件。

4.编写Android.mk文件。

5.通过cygwin,进入到该工程目录,通过ndk-buld命令,编译c文件,生成so库文件

6.即可完成调用

 

 

怎样在c中调用java?

也就是要在c代码中,new出java对象,然后再调用java对象中的方法即可。

要创建java对象,就要找到java类,相当于找到类的class文件,使用jni中的

FindClass去找到相应的类,然后再调用相应的方法。

简单代码:

//new 出java对象
	jclass clazz = (*env)->FindClass(env,"com/devchina/ndk4/DevchinaProvider");//注意:不能为“.”
	//获取类中的方法
	jmethodID j_method = (*env)->GetMethodID(env,clazz,"helloFromJava","()V");//最后一个参数是表示方法的签名
	(*env)->CallVoidMethod(env,obj,j_method);//第二个参数表示调用的类对象


 

 

 

怎样获得java类方法中的签名:

通过javap -s com.devchina.ndk4.devchinaActivity可以显示出方法的签名。

其中Sigature:后面的就是方法的签名。

 

 

注意:c调用java,一般是把native的方法,放到c需要回调的java类中。这样就能直接把该类的对象

           传递给c了。

例:

JNIEXPORT void JNICALL Java_com_devchina_ndk4_DevchinaProvider_callCcode
  (JNIEnv * env, jobject obj){//ojb,谁调用了此Native方法,这个Obj就是谁,这个要在回调就去中使用,所以要传递该方法所在的类对象。
	//new 出java对象
	jclass clazz = (*env)->FindClass(env,"com/devchina/ndk4/DevchinaProvider");//注意:不能为“.”
	if(clazz==0){//没有找到类
		LOGI("can't find devchina class");
	}else{
		LOGI("find dechina class");
	}

	//获取类中的方法
	jmethodID j_method = (*env)->GetMethodID(env,clazz,"helloFromJava","()V");//最后一个参数是表示方法的签名
	if(j_method==0){
		LOGI("can't get method");
	}else{
		LOGI("get method");
	}

	(*env)->CallVoidMethod(env,obj,j_method);//第二个参数表示调用的类对象,需要是在该类中调用native方法,传递的Obj


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值