阅读113 返回首页    go 阿里云 go 技术社区[云栖]


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

 

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


 

最后更新:2017-04-02 17:09:25

  上一篇:go 用户体验是个什么东西?用户体验如何评价好坏?怎样用一句话描述用户体验评价方法的核心?
  下一篇:go jni使用基础(三)之Android.mk文件详解