如何解决JNI:对于同一个对象,GetObjectClass 的返回值是否应该有所不同? 本地参考
以下是一些让我在 OpenJDK 8.272 上困惑的 JNI 行为(代码使用 C++):
JNIEXPORT jlong JNICALL Java_/*name omitted*/(JNIEnv *env,jclass,jobject obj) {
assert(env->GetObjectClass(obj) == env->GetObjectClass(obj));
return 0;
}
此断言失败。这是预期的行为吗?如果是这样,使用 GetObjectClass
返回的 jclass 安全多久?每次我需要访问 GetObjectClass
时,我是否应该再次调用 jclass
?
解决方法
本地参考
本地引用在本地方法调用期间有效。在本机方法返回后,它们会自动释放。每个本地引用都会消耗一定数量的 Java 虚拟机资源。程序员需要确保本地方法不会过度分配本地引用。虽然本地方法返回Java后会自动释放本地引用,但是本地引用的过度分配可能会导致VM在本地方法执行过程中内存不足。
所以不,在本地方法的单次执行中,您不应在每次需要访问 GetObjectClass
时再次调用 jclass
。在当前调用期间保留引用并重复使用它。
您可以使用函数 IsSameObject
测试两个引用是否指向同一个对象。但是,如上所述,当一个函数应该评估您已经引用的同一个对象时,您应该避免创建新的引用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。