2011-05-02 46 views
65

書「基本JNI:Java本地接口」,由羅布·戈登包含下面的代碼示例到的jstring轉換爲C字符串:如果GetStringUTFChars返回副本,您應該調用ReleaseStringUTFChars嗎?

const char* utf_string; 
jboolean isCopy; 
utf_string = env->GetStringUTFChars(str, &isCopy); 
/* ... use string ... */ 
if (isCopy == JNI_TRUE) { 
    env->ReleaseStringUTFChars(str, utf_string); 
} 

注意,它只調用ReleaseStringUTFChars如果isCopy是真實的。

但是,這本書Java Native Interface: Programmer's Guide and Specification(備用鏈接:http://192.9.162.55/docs/books/jni/html/objtypes.html#5161)說:

的ReleaseString-個字符呼叫 必要GetStringChars是否有 設定完成後將* isCopy到JNI_TRUE或JNI_FALSE。 ReleaseStringChars或者釋放 拷貝或者取消實例,取決於 關於GetStringChars是否有 返回副本。

我正確地認爲這是Gordon書中的錯誤嗎?

+1

'str'定義在哪裏? – SomethingSomething 2017-08-14 14:37:48

回答

55

是的,你的假設是正確的(你應該總是調用ReleaseStringUTFChars)。

+0

如果不會被調用,會發生什麼? – Tama 2017-12-12 03:42:35

+0

內存將被泄漏(JVM會相信您無限期地需要內存)。 – 2017-12-12 13:21:26

+0

當然!但是爲什麼我們沒有針對其他數據類型的免費分配內存函數,例如:int,double。它應該是RealseInt(arg,arg),ReleaseDouble(arg,arg)...或者類似的東西? – Tama 2017-12-13 02:00:50

相關問題