Всегда ли у `jobject` один и тот же адрес, если он представляет один и тот же экземпляр Java?

Данный объект Java A a = new A()и куча нативных методов экземпляра, если бы я взял адрес jobject представляющий a передается в эти методы, адрес всегда будет одинаковым?

У меня есть несколько полей final в этих классах, которые я хочу сохранить в hashmap в моем C-коде (поэтому мне не нужно продолжать получать их с помощью Get___Field), с хешем jobject быть адресом. Если я могу гарантировать, что адрес прошел в jobject представляющий a всегда будет одинаковым, тогда хеш будет детерминированным, что означает, что поведение моей программы не будет противоречивым.

1 ответ

Решение

Как уже отмечалось в комментариях, вы не можете сохранить jobject за пределами текущего контекста вызова JNI, потому что это локальная ссылка. jobject значения могут быть повторно использованы (что приводит к дублированию записей таблицы) или могут стать недействительными. Кроме того, каждый звонок CreateGlobalRef() создаст новый, отличный jobject, Краткий ответ: "Вы не можете сделать это таким образом". Об этом уже говорилось в этом посте. В качестве альтернативного подхода обратите внимание, что каждый объект Java имеет hashCode() а также equals() метод. Вы можете вызывать эти методы из своего кода C/C++, используя JNI, и использовать их в своей хэш-таблице. Однако, не зная деталей того, когда и как вы выбираете значения полей, вызов методов JNI может быть не лучше, чем повторный выбор значений полей.

Наконец, как ответили в этом вопросе, вы можете проверить jobject равенство напрямую env->IsSameObject(jobject1, jobject2), Предположительно, jobject1 является глобальной ссылкой, которую вы создали и сохранили, тогда как jobject2 переданная локальная ссылка, с которой вы хотите проверить. К сожалению, это все еще не помогает вам исследовать вашу хэш-таблицу.

Другие вопросы по тегам