Всегда ли у `jobject` один и тот же адрес, если он представляет один и тот же экземпляр Java? - PullRequest
0 голосов
/ 20 ноября 2018

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

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

1 Ответ

0 голосов
/ 26 ноября 2018

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

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

...