我知道下面的代碼可以比較是否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