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

2022-08-31 13:04:11

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);
}

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

但是《Java Native Interface: Programmer's Guide and Specification》(备选链接:)一书说:http://192.9.162.55/docs/books/jni/html/objtypes.html#5161

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

我假设这是戈登书中的一个错误是正确的吗?


答案 1

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


答案 2

推荐