Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JNI:GetObjectClass的返回值对于同一个对象应该是不同的吗?_Java_C++_Java 8_Java Native Interface - Fatal编程技术网

Java JNI:GetObjectClass的返回值对于同一个对象应该是不同的吗?

Java JNI:GetObjectClass的返回值对于同一个对象应该是不同的吗?,java,c++,java-8,java-native-interface,Java,C++,Java 8,Java Native Interface,在OpenJDK 8.272(代码是用C++编写的)上,有一些JNI行为让我感到困惑: 这个断言失败了。这是预期的行为吗?如果是,使用GetObjectClass返回的jclass安全多久?每次需要访问jclass,我是否应该再次调用GetObjectClass?引用: 本地参考 本地引用在本机方法调用期间有效。它们在本机方法返回后自动释放。每个本地引用都会消耗一些Java虚拟机资源。程序员需要确保本机方法不会过度分配本地引用。尽管本地方法返回Java后会自动释放本地引用,但本地引用的过度分配可

在OpenJDK 8.272(代码是用C++编写的)上,有一些JNI行为让我感到困惑:

这个断言失败了。这是预期的行为吗?如果是,使用
GetObjectClass
返回的jclass安全多久?每次需要访问
jclass
,我是否应该再次调用
GetObjectClass

引用:

本地参考 本地引用在本机方法调用期间有效。它们在本机方法返回后自动释放。每个本地引用都会消耗一些Java虚拟机资源。程序员需要确保本机方法不会过度分配本地引用。尽管本地方法返回Java后会自动释放本地引用,但本地引用的过度分配可能会导致VM在执行本地方法期间内存不足

因此,不应该每次需要访问
jclass
时,在本机方法的一次执行中再次调用
GetObjectClass
。在当前调用期间,保留引用并重新使用它

您可以使用函数测试两个引用是否指向同一对象。但是,如上所述,当一个函数应该对已经引用的同一对象求值时,应该避免创建新引用。

引用:

本地参考 本地引用在本机方法调用期间有效。它们在本机方法返回后自动释放。每个本地引用都会消耗一些Java虚拟机资源。程序员需要确保本机方法不会过度分配本地引用。尽管本地方法返回Java后会自动释放本地引用,但本地引用的过度分配可能会导致VM在执行本地方法期间内存不足

因此,不应该每次需要访问
jclass
时,在本机方法的一次执行中再次调用
GetObjectClass
。在当前调用期间,保留引用并重新使用它


您可以使用函数测试两个引用是否指向同一对象。但是,如上所述,当一个函数应该对您已经引用的同一对象求值时,您应该避免创建新的引用。

jclass
基本上是一个返回到JVM的类对象的句柄。对类对象有两个打开的本地引用(
GetObjectClass
调用了两次),因此有两个句柄。这两个本地引用(句柄)没有理由具有相同的值。
jobject
jclass
生命周期在JNI规范中讨论,但是在一个JNI方法中,当您已经得到结果时,为什么还要再次调用它呢?类似于
jclass
基本上是一个返回到JVM中的类对象的句柄。对类对象有两个打开的本地引用(
GetObjectClass
调用了两次),因此有两个句柄。没有理由认为这两个本地引用(句柄)应该具有相同的值。
jobject
jclass
生命期在JNI规范中进行了讨论,但是在一个JNI方法中,当您已经得到结果时,为什么还要再次调用它?类似于这一点是有意义的!规范中的何处标记了哪些参考是本地参考?我想我可能存储了相当多的引用太久了…@MatthewMilano除了弱引用和全局引用之外,所有从JNI API获得的引用都是本地引用。这很有意义!规范中的何处标记了哪些参考是本地参考?我想我可能存储了相当多的引用太久了…@MatthewMilano从jniapi获得的所有引用,除了弱引用和全局引用之外,都是本地引用。
JNIEXPORT jlong JNICALL Java_/*name omitted*/(JNIEnv *env, jclass, jobject obj) {
  assert(env->GetObjectClass(obj) == env->GetObjectClass(obj));
  return 0;
}