歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android中C++調用Java實現

Android中C++調用Java實現

日期:2017/3/1 9:59:41   编辑:Linux編程

1:需求分析

在Android中利用NDK進行編程的時候,一般的都是Java層通過JNI調用C++的相關接口,而在有的應用中,需要通過底層C++調用Java層來實現相關功能。比如在進行OMX硬解碼畫圖的時候,需要在底層不斷發送請求給Java層,讓其不斷刷新GlSurfaceView。

2:java層接口

a://彈出消息對話框

public static int showMessage(Stringtitle,String val)

{

newAlertDialog.Builder(m_scMnCtx)

.setTitle(title)

.setMessage(val)

.setPositiveButton("確定",

new DialogInterface.OnClickListener(){

publicvoidonClick(DialogInterface dialoginterface,int i){

}}).show();

return 0;

}

其中參數title為標題,val為消息內容。

b: native方法

publicnativestaticint testCallBack(Stringtitle,String val)

3:JNI層接口

/*

* Class: org_yao_ndk_NDKTest

* Method: testCallBack

* Signature: (Ljava/lang/String;Ljava/lang/String;)I

*/

JNIEXPORT jint JNICALLJava_org_yao_ndk_NDKTest_testCallBack

(JNIEnv *env, jclass obj, jstringtitle, jstring val)

{

jmethodID java_method =env->GetStaticMethodID(obj, "showMessage","(Ljava/lang/String;Ljava/lang/String;)I");

if(java_method == 0)

{

return 0;

}

env->CallStaticIntMethod(obj,java_method,title,val);

return 1;

}

其中,GetStaticMethodID獲取java中靜態方法的ID,obj為方法所在的類,showMessage為Java層接口名,"(Ljava/lang/String;Ljava/lang/String;)I"其中括號裡面對應native方法testCallBack輸入參數,外面為返回參數,可以參考/*Signature*/注釋信息。在獲取到方法ID以後就可以用CallStaticIntMethod來調用Java層接口showMessage了。其中CallStaticIntMethod中Int要和publicnative static int testCallBack(String title,String val)中int一致。

Copyright © Linux教程網 All Rights Reserved