必须在GetStringUTFChars之后调用ReleaseStringUTFChars(将char *传递给C函数时)?

时间:2012-08-21 17:07:45

标签: java c++ c java-native-interface

我对从java传递给c的对象有点困惑?它们应该在本机jni方法中删除,还是在方法返回时进行垃圾收集。例如:

如果我的java文件public native printString(String msg);中有本机声明,并且本机方法使用const char *message = (jni_env)->GetStringUTFChars(msg, &iscopy);来获取字符串的c样式字符数组。在使用本机方法完成所有操作之后Shoud I call (jni_env)->ReleaseStringUTFChars(msg, message);。如果是,那么为什么有必要呢?为什么java运行时环境不代表程序员这样做呢?在声明所有字符串并从java环境传递之后。

1 个答案:

答案 0 :(得分:5)

Get Characters函数将字符固定在内存中,直到调用Release方法。 Java无法进行垃圾收集或以其他方式移动此数据,直到确定没有人使用它为止。

Java VM一旦离开Java虚拟机就无法知道内存的使用时间,因此需要手动通知内存已经完成。