2017-01-23 3 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. Функции JNI, такие как IsSameObject, обеспечивают уровень абстракции.

В дескрипторах JSM HotSpot указаны указатели на изменяемые ссылки на объекты.
IsSameObject выполняет что-то вроде

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

но атомарно в отношении объекта перемещения.

+0

Спасибо большое! Итак, мы не можем получить адрес объекта Java JNI, так? Я имею в виду, что объект в собственном коде не указывает на соответствующий объект Java, правильно? – tiger

+0

@tiger Право. В общем, мы не можем получить адрес объекта через JNI. – apangin

+0

спасибо. Мне любопытно, что есть способ получить это? – tiger