1

我遇到了 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
4

1 回答 1

1

我还应该检查本地参考 IsSameObject

文档提供了答案:

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

如果对象已被释放,您将从中获取NULLNewLocalRef因此无需调用IsSameObject.

于 2016-10-13T13:46:16.787 回答