我遇到了一个问题,即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

最佳答案

我也应该检查本地引用IsSameObject吗


The documentation提供了答案:


  建议使用JNI函数NewLocalRefNewGlobalRef获取对同一对象的标准(强)本地或全局引用,并使用此强引用来访问预期的对象。如果已释放对象,则这些函数将返回NULL,否则将返回强引用(这将防止对象被释放)。当不再需要立即访问该对象时,应该显式删除新引用,从而可以释放该对象。


如果对象已被释放,则可以从NULL获取NewLocalRef,因此无需调用IsSameObject

10-07 12:20