我遇到了WeakGlobalRef指向垃圾收集对象的问题,当我尝试在此ref上调用CallVoidMethod时这个崩溃的应用程序。为了解决这个问题,我做了以下几点:
jobject javaObject = pEnv->NewLocalRef(m_pJavaObject);
if (javaObject)
{
pEnv->CallVoidMethod(javaObject, method, object);
}
这仍然在CallVoidMethod崩溃,这是有效的,或者我也应该检查本地参考IsSameObject
我在转储时得到的最后一件事,没有任何可以指出任何方法的东西:
Crash reason: SIGSEGV
Crash address: 0xdead4321
Process uptime: not available
Thread 0 (crashed)
(...)
41 libart.so + 0xba7df
sp = 0xbeed2dc0 pc = 0xb4eca7e1
Found by: stack scanning
42 libxxx.so!_JNIEnv::CallVoidMethod(_jobject*, _jmethodID*, ...) [jni.h : 650 + 0x1]
sp = 0xbeed2dd8 pc = 0x9fabbeb9
Found by: stack scanning
答案 0 :(得分:1)
我应该检查本地ref IsSameObject
The documentation提供了答案:
建议使用JNI函数
NewLocalRef
或NewGlobalRef
获取对同一对象的标准(强)本地或全局引用,并使用此强引用来访问目标对象。 如果对象已被释放,这些函数将返回NULL,否则将返回强引用(这将阻止对象被释放)。当不再需要立即访问对象时,应该显式删除新引用,允许释放该对象。
如果对象已被释放,您将从NULL
获得NewLocalRef
,因此无需拨打IsSameObject
。