JNIのローカルおよびグローバル参照に関するいくつかの参照を読みました。しかし、JNI関数にパラメーターとして渡されるJavaオブジェクトがローカル参照であるか、グローバル参照であるかについて、明確な答えを見つけることができませんでした。私はそれがグローバルであるべきだと思っていましたが、1つの問題があります:
まず、Javaオブジェクトポインタを取得して保存します。次に、ネイティブコールバック関数がそのオブジェクトのメソッドを呼び出します。コールバック関数は別のスレッドから呼び出されます。スレッドはAttachCurrentThread()を使用して作成されたため、JVMはそれを認識しています。JNIEnv *変数も有効であり、オブジェクトはガベージコールされていませんでしたが、警告が表示されてからクラッシュします。
JNI警告:0x4108edb8は、Lcom / my / company / MyClass; .load:(Ljava / lang / String;)V(GetObjectClass)の有効なJNI参照ではありません