閱讀113 返回首頁    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文件詳解