實例引用,與一個數組和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);