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

Edw*_*per 71 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->ReleaseStringUTFChars(str, utf_string);
}
Run Code Online (Sandbox Code Playgroud)

需要注意的是它只调用ReleaseStringUTFChars,如果isCopy是真实的.

但是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是否返回了副本.

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

Bre*_*ail 60

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

  • Int和double不像字符串那样是可变长度的,因此数据可以简单地复制到调用者.(最好是创建一个新问题,而不是继续就一个有6年历史的答案进行对话.) (3认同)
  • 内存会泄漏(JVM 会认为您无限期地需要内存)。 (2认同)
  • 当然可以!但是为什么我们没有为其他数据类型(例如:int,double)自由分配内存的功能。应该是RealseInt(arg,arg),ReleaseDouble(arg,arg)...或类似的东西吗? (2认同)