我知道下面的代码可以比较是否OBJ1和OBJ2份额标注相同的:JNI函数(isSameObject)如何在本机代码中实现?
(*env)->IsSameObject(env, obj1, obj2)
其实,我尝试检查这两个对象裁判直接,如:
jboolean result = (obj1 == obj2);
但结果与“IsSameObject”的结果不同。
我想知道IsSameObject是如何实现的,为什么(obj1 == obj2)的结果是不同的?
我知道下面的代码可以比较是否OBJ1和OBJ2份额标注相同的:JNI函数(isSameObject)如何在本机代码中实现?
(*env)->IsSameObject(env, obj1, obj2)
其实,我尝试检查这两个对象裁判直接,如:
jboolean result = (obj1 == obj2);
但结果与“IsSameObject”的结果不同。
我想知道IsSameObject是如何实现的,为什么(obj1 == obj2)的结果是不同的?
JNI句柄不是直接指向Java对象的指针。垃圾收集期间,Java对象可以跨堆移动。它们的内存地址可能会更改,但JNI句柄必须保持有效。
JNI句柄对用户是不透明的,也就是说,句柄的实现是JVM特定的。像IsSameObject
这样的JNI函数提供了抽象层。
在HotSpot JVM句柄是指向可变对象引用的指针。
IsSameObject
执行类似
return obj1 == obj2 || obj1 != NULL && obj2 != NULL && *(void**)obj1 == *(void**)obj2;
但原子在相对于对象重新定位。
如果其中一个操作数是另一个操作数的'GlobalRef',那么您的平等检查可能会失败。 – EJP