JNI函数(isSameObject)如何在本机代码中实现?

时间:2017-01-23 16:44:18

标签: java-native-interface

我知道下面的代码可以比较obj1和obj2是否共享相同的引用:

(*env)->IsSameObject(env, obj1, obj2)

实际上,我尝试直接检查这两个对象的参考:

jboolean result = (obj1 == obj2);

但结果与“IsSameObject”的结果不同。

我想知道IsSameObject是如何实现的,为什么(obj1 == obj2)的结果不同?

1 个答案:

答案 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;

但在对象重定位方面具有原子性。