我对从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虚拟机,将不知道该内存将使用多长时间,因此,它需要手动通知该内存已用完。