Android 来自WeakGlobalRef的JNI LocalRef

Android 来自WeakGlobalRef的JNI LocalRef,android,reference,java-native-interface,jnienv,Android,Reference,Java Native Interface,Jnienv,我有一个问题,WeakGlobalRef指向垃圾收集对象,当我尝试调用此引用上的CallVoidMethod时,此应用程序崩溃。要解决此问题,我执行以下操作: jobject javaObject = pEnv->NewLocalRef(m_pJavaObject); if (javaObject) { pEnv->CallVoidMethod(javaObject, method, object); } CallVoidMethod仍然崩溃,这样做有效吗,还是我应该检查

我有一个问题,WeakGlobalRef指向垃圾收集对象,当我尝试调用此引用上的CallVoidMethod时,此应用程序崩溃。要解决此问题,我执行以下操作:

jobject javaObject = pEnv->NewLocalRef(m_pJavaObject);

if (javaObject)
{
    pEnv->CallVoidMethod(javaObject, method, object);
}
CallVoidMethod仍然崩溃,这样做有效吗,还是我应该检查本地ref
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
我是否也应该检查本地ref IsSameObject

提供了答案:

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


如果对象已被释放,您将从
NewLocalRef
中获得
NULL
,因此无需调用
IsSameObject

“这仍然在CallVoidMethod中崩溃”,那么您可能应该将错误消息/stacktrace添加到您的问题中。@Michael我添加了堆栈的一部分和错误