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

由Rob Gordon编写的“Essential JNI:Java本地接口”一书包含下面的代码示例,用于将jstring转换为Cstring:

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

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

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

我正确地认为这是Gordon书中的一个错误?

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