113
技術社區[雲棲]
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