問題1: 我有一個靜態方法的Java類:當我從C++調用Java方法時,是否應該調用PushLocalFrame和PopLocalFrame?
class Test {
static public void show (String value) {
// dosomething with value
}
}
如果我想從C++調用它:
jstring value = env->NewStringUTF("Hello, World");
// ExceptionCheck after NewStringUTF.
env->CallStaticVoidMethod(the_jclass, the_jmethodID, value);
// ExceptionCheck after CallStaticVoidMethod.
我應該把PushLocalFrame前NewStringUTF,並把PopLocalFrame後CallStaticVoid方法釋放本地引用?
問題2:
我看到的聲明PopLocalFrame,它是:
jobject PopLocalFrame(JNIEnv *env, jobject result);
閱讀JNI的文件後,我仍然無法理解爲什麼PopLocalFrame需要結果參數和一個返回值。你能舉個例子來證明它的存在價值嗎?
謝謝,micheal。換句話說,如果我在C++中使用NewStringUTF(並且它不是在java本地方法實現中,所以它不會返回到java。),我有責任釋放這個本地引用。從PopLocalFrame返回的值可能與傳入的參數不同? –
如果/當您返回到Java時,本地引用將被刪除。但是,如果函數需要創建大量本地引用或不返回到Java,那麼您應該明確刪除您創建的本地引用。 PopLocalFrame返回的值可能與傳遞給它的參數不同。但即使你得到相同的值,並不意味着參考文獻沒有發生任何變化(參考文獻仍然會被轉移到前面的本地參考文獻框架中)。 – Michael