Всегда ли у `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
переданная локальная ссылка, с которой вы хотите проверить. К сожалению, это все еще не помогает вам исследовать вашу хэш-таблицу.