2017-01-23 44 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