2017-01-23 42 views
0

我知道下面的代码可以比较是否OBJ1和OBJ2份额标注相同的:JNI函数(isSameObject)如何在本机代码中实现?

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

其实,我尝试检查这两个对象裁判直接,如:

jboolean result = (obj1 == obj2); 

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

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

+0

如果其中一个操作数是另一个操作数的'GlobalRef',那么您的平等检查可能会失败。 – EJP

回答

-1

JNI句柄不是直接指向Java对象的指针。垃圾收集期间,Java对象可以跨堆移动。它们的内存地址可能会更改,但JNI句柄必须保持有效。

JNI句柄对用户是不透明的,也就是说,句柄的实现是JVM特定的。像IsSameObject这样的JNI函数提供了抽象层。

在HotSpot JVM句柄是指向可变对象引用的指针。
IsSameObject执行类似

return obj1 == obj2 || obj1 != NULL && obj2 != NULL && *(void**)obj1 == *(void**)obj2; 

但原子在相对于对象重新定位。

+0

非常感谢!所以,我们无法通过JNI获取Java对象地址,对吧?我的意思是,本地代码中的对象不是指向相应的Java对象,对吧? – tiger

+0

@tiger对。一般来说,我们无法通过JNI获取对象地址。 – apangin

+0

谢谢。我很好奇,有什么方法可以得到它吗? – tiger