我知道下面的代码可以比较obj1和obj2是否共享相同的引用:
(*env)->IsSameObject(env, obj1, obj2)
实际上,我尝试直接检查这两个对象的参考:
jboolean result = (obj1 == obj2);
但结果与“IsSameObject”的结果不同。
我想知道IsSameObject是如何实现的,为什么(obj1 == obj2)的结果不同?
答案 0 :(得分:-1)
JNI句柄不是指向Java对象的直接指针。垃圾收集期间,Java对象可以在Heap中移动。他们的内存地址可能会改变,但JNI句柄必须保持有效。
JNI句柄对用户不透明,即句柄的实现是特定于JVM的。像IsSameObject
这样的JNI函数提供了抽象层。
在HotSpot中,JVM句柄是指向可变对象引用的指针
IsSameObject
执行类似
return obj1 == obj2 || obj1 != NULL && obj2 != NULL && *(void**)obj1 == *(void**)obj2;
但在对象重定位方面具有原子性。