Java 如果GetStringUTFChars返回副本,是否应该调用ReleaseStringUTFChars?

Java 如果GetStringUTFChars返回副本,是否应该调用ReleaseStringUTFChars?,java,java-native-interface,Java,Java Native Interface,Rob Gordon的书“Essential JNI:Java Native Interface”包含以下将jstring转换为C字符串的代码示例: const char* utf_string; jboolean isCopy; utf_string = env->GetStringUTFChars(str, &isCopy); /* ... use string ... */ if (isCopy == JNI_TRUE) { env->ReleaseString

Rob Gordon的书“Essential JNI:Java Native Interface”包含以下将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);
}
请注意,如果
isCopy
为true,它只调用
ReleaseStringUTFChars

但是这本书(替代链接:
http://192.9.162.55/docs/books/jni/html/objtypes.html#5161
)说:

ReleaseString Chars调用为 GetStringChars是否具有 将*isCopy设置为JNI_TRUE或JNI_FALSE。 释放StringChars或释放 复制或取消绑定实例,具体取决于 关于GetStringChars是否 是否返回了副本


我认为这是Gordon书中的一个bug是正确的?

是的,你的假设是正确的(你应该总是调用ReleaseStringUTFChars)。

哪里定义了
str
呢?如果不调用它会怎么样?内存会泄漏(JVM会认为你无限期地需要内存)。当然!但为什么我们没有为其他数据类型(例如:int、double)分配空闲内存函数呢。它应该是RealseInt(arg,arg)、ReleaseDouble(arg,arg)…或者类似的东西?Int和double不像字符串那样是可变长度的,因此可以轻松地将数据复制到调用方。(最好是提出一个新问题,而不是继续讨论一个6年前的答案。)