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