我对从Java传递给c的对象有些困惑?应该在 native jni方法中将它们删除,否则在方法返回时将对其进行垃圾回收。例如:

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

最佳答案

获取字符功能将字符固定在内存中,直到调用Release方法为止。在确定没有人使用Java之前,Java无法对其进行垃圾收集或以其他方式移动该数据。

Java VM一旦离开Java虚拟机,将不知道该内存将使用多长时间,因此,它需要手动通知该内存已用完。

09-05 22:50
查看更多