2016-03-24 66 views
2

問題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. 

我應該把PushLocalFrameNewStringUTF,並把PopLocalFrameCallStaticVoid方法釋放本地引用?

問題2:

我看到的聲明PopLocalFrame,它是:

jobject PopLocalFrame(JNIEnv *env, jobject result); 

閱讀JNI的文件後,我仍然無法理解爲什麼PopLocalFrame需要結果參數和一個返回值。你能舉個例子來證明它的存在價值嗎?

回答

2

我應該把PushLocalFrameNewStringUTF之前,把PopLocalFrameCallStaticVoidMethod後釋放局部引用?

在這種特殊情況下,我看不到這一點。您可以使用DeleteLocalRef刪除您的本地參考,而不是創建新的本地參考框架。

我仍然無法理解爲什麼PopLocalFrame需要一個結果參數和返回值

說你創建了一個新的本地參照系與PushLocalFrame和要刪除上創建的所有本地引用以外,還有一個你想要保留的引用(例如你創建了一個你想從函數返回的對象)。
您通過將想要保留的引用傳遞到PopLocalFrame來實現此目的,並且您返回的值是在之前的本地參考框架(現在是當前參考框架)內對該對象的引用。

+0

謝謝,micheal。換句話說,如果我在C++中使用NewStringUTF(並且它不是在java本地方法實現中,所以它不會返回到java。),我有責任釋放這個本地引用。從PopLocalFrame返回的值可能與傳入的參數不同? –

+0

如果/當您返回到Java時,本地引用將被刪除。但是,如果函數需要創建大量本地引用或不返回到Java,那麼您應該明確刪除您創建的本地引用。 PopLocalFrame返回的值可能與傳遞給它的參數不同。但即使你得到相同的值,並不意味着參考文獻沒有發生任何變化(參考文獻仍然會被轉移到前面的本地參考文獻框架中)。 – Michael

相關問題