1

WeakGlobalRef がガベージ コレクションされたオブジェクトを指しているという問題がありました。この ref で 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
4

1 に答える 1

1

ローカル参照 IsSameObject もチェックする必要があります

ドキュメントは答えを提供します:

NewLocalRefJNI 関数またはを使用して、同じオブジェクトへの標準 (強い) ローカル参照またはグローバル参照を取得し、NewGlobalRefこの強い参照を使用して目的のオブジェクトにアクセスすることをお勧めします。これらの関数は、オブジェクトが解放されている場合は NULLを返し、それ以外の場合は強い参照を返します (これにより、オブジェクトが解放されなくなります)。オブジェクトにすぐにアクセスする必要がなくなったら、新しい参照を明示的に削除して、オブジェクトを解放できるようにする必要があります。

オブジェクトが解放されている場合はNULLから取得するためNewLocalRef、 を呼び出す必要はありませんIsSameObject

于 2016-10-13T13:46:16.787 に答える