如果GetStringUTFChars返回了副本,您应该调用ReleaseStringUTFChars吗?


74

Rob Gordon撰写的《 Essential JNI:Java本机接口》一书包含以下代码示例,可将jstring转换为C字符串:

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

请注意,它仅ReleaseStringUTFCharsisCopy为true时调用。

但是《Java本机接口:程序员指南和规范》一书(替代链接http://192.9.162.55/docs/books/jni/html/objtypes.html#5161:)说:

无论GetStringChars已将* isCopy设置为JNI_TRUE还是JNI_FALSE,都必须使用ReleaseString-Chars调用。ReleaseStringChars释放副本或取消固定实例,具体取决于GetStringChars是否返回了副本。

我以为这是戈登书中的错误是正确的吗?


2
在哪里str定义?
SomethingSomething

Answers:


63

是的,您的假设是正确的(您应该始终调用ReleaseStringUTFChars)。


如果不调用该怎么办?
布尔玛

1
内存将泄漏(JVM将认为您无限期需要内存)。
布雷特·凯尔

2
当然可以!但是为什么我们没有为其他数据类型(例如:int,double)自由分配内存的功能。应该是RealseInt(arg,arg),ReleaseDouble(arg,arg)...或类似的东西吗?
布尔玛

4
Int和double不是像字符串一样的可变长度,因此可以将数据简单地复制到调用方。(最好是提出一个新问题,而不是继续讨论已有6年历史的答案。)
Brett Kail

1
谢谢!我明白了
布尔玛
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.