1. 程式人生 > >JNIEnv的使用在C和C++中的區別

JNIEnv的使用在C和C++中的區別

Java呼叫C和C++函式時的JNI使用區別:
注意:jni.h標頭檔案中對於***.c & ***.cpp採用不同的定義
在C的定義中,env是一個兩級指標,而在C++的定義中,env是個一級指標
C形式需要對env指標進行雙重deferencing,而且須將env作為第一個引數傳給jni函式
jclass (JNICALL *GetObjectClass) (JNIEnv *env, jobject obj);
jclass GetObjectClass(jobject obj)
{
return functions->GetObjectClass(this,obj);
}

對於***.c
1.jclass test_class = (*env)->GetObjectClass(env, obj);

2.jfieldID id_num = (*env)->GetFieldID(env, test_class, "num", "I");
對於 ***.cpp
1.jclass test_class = env->GetObjectClass(obj);
2.jfieldID id_num = env->GetFieldID(test_class, "num", "I");
在 C 中,
JNI 函式呼叫由“(*env)->”作字首,目的是為了取出函式指標所引用的值。
C++ 中,
JNIEnv 類擁有處理函式指標查詢的內聯成員函式。
下面將說明這個細微的差異,其中,這兩行程式碼訪問同一函式,但每種語言都有各自的語法。

C 語法:jsize len = (*env)->GetArrayLength(env,array);
C++ 語法:jsize len =env->GetArrayLength(array);