я кэшировать ссылку на объект Java в моем родном коде, так же, как это:JNI Ошибка: доступ несвежий слабая глобальная ссылка
// java global reference deleter
// _JAVA_ENV is an instance of JNIEnv that is cached globally and just
// valid in current thread scope
static void g_java_ref_deleter(jobject ptr) {
_JAVA_ENV->DeleteGlobalRef(ptr);
}
// native class caches a java object reference
class NativeA {
private:
shared_ptr<_jobject> M_java_object;
public:
setJavaObject(jobject obj) {
M_java_object = shared_ptr<_jobject>(_JAVA_ENV->NewGlobalRef(obj), g_java_ref_deleter);
}
shared_ptr<_jobject> getJavaObject() const {
return M_java_object;
}
}
и я доступ к нему в другом родном классе:
class NativeB {
public:
void doSomething(NativeA& a) {
// here I got an error: accessed stale weak global reference
// make_record do something on java object (set float field actually)
make_record(a.getJavaObject().get());
}
}
Этот код запускается на Android 4.3. Почему я получаю эту ошибку и как ее исправить?
Вам также необходимо удалить локальную ссылку на работу, которую вы получите в методе setJavaObject, хотя она не решит вашу ошибку. Просто чтобы ты знал. – 7383
Вы уверены, что действительно передаете «jobject» везде, где это необходимо, а не какое-то другое значение? Кажется, вы не создаете каких-либо слабых глобальных ссылок, если вы не делаете это в какой-либо другой части вашего кода, которую вы нам не показали (?). 2 младших значащих бита «jobject» используются для определения того, какая у вас ссылка, а глобальная ссылка и слабая глобальная ссылка будут иметь разные значения в этих двух битах. – Michael
@ 7383 Да, я делаю это по другой функции – Artiano