В коде есть несколько ошибок.
jobject myObject
и jclass myClass
повторно используются в вызовах JNI. Все jobjects
, созданные внутри JNI-метода, по умолчанию являются локальными ссылками. Всякий раз, когда возвращается метод JNI, все локальные ссылки автоматически освобождаются. Если вы хотите повторно использовать jobject
(или jclass
, который также является ссылкой на объект) через вызовы методов, вы должны преобразовать его в глобальную ссылку, используя NewGlobalRef . Если глобальная ссылка больше не нужна, ее следует удалить с помощью DeleteGlobalRef , иначе объект, на который ссылается, никогда не будет собираться с помощью мусора. JNIEnv*
кэшируется. В общем случае JNIEnv*
никогда не должны храниться для последующего повторного использования. Вместо этого вы должны использовать JNIEnv*
в качестве первого аргумента для каждой функции JNI. В качестве альтернативы это может быть получено вызовом GetEnv . Обратите внимание, что каждый поток имеет свой собственный JNIEnv*
, который не применим к другим потокам.
jobject myObject
иjclass myClass
в глобальные ссылки с использованием NewGlobalRef делало трюк. Благодаря! – Martin Rindarøy 14 March 2016 в 09:54