JNI應用筆記(陸續更新)

實例引用,與一個數組和java.lang.Object類或它的子類的實例對應:

jobject

類引用,與java.lang.Class實例對應,它代表着類的類型:

jclass

通過對象實例獲取類(以實例引用獲得類引用):

jobject callbackListener
jclass clazz = env->GetObjectClass(callbackListener);

以java類引用(如上述的clazz),獲得其實例方法(的ID):

sAndroidEnvInfo.callbackMethodId = env->GetMethodID(clazz, "TADREngineStatusCallback", "([B)V");

JavaVM是虛擬機在JNI中的表示,一個JVM中只有一個JavaVM對象,其爲線程共享.通過JNIEnv我們可以獲取一個JavaVM,參數爲JavaVM**:

env->GetJavaVM(&(sAndroidEnvInfo.javaVM));

以局部引用初始化全局引用(可理解爲離開作用域依然有效,直到手動DeleteGlobalRef):

sAndroidEnvInfo.callbackObject = env->NewGlobalRef(callbackListener);

同JNI調用Java靜態方法一樣,JVM針對所有數據類型的返回值都定義了相關的函數(CallXXXMethod),如:CallIntMethod、CallFloatMethod、CallObjectMethod等,也同樣提供了支持三種類型實參的函數實現,以CallVoidMethod爲例,如下是jni.h頭文件中該函數的原型:

void (JNICALL *CallVoidMethod)(JNIEnv *env, jobject obj, jmethodID methodID, ...);
void (JNICALL *CallVoidMethodV)(JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
void (JNICALL *CallVoidMethodA)(JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章