3

私の会社が開発したプライベートライブラリがあります。コールバック関数を設定できるようにしたので、長時間の操作が完了した後、サブスレッドでコールバックが呼び出されます。

コールバックで JVM を操作する必要があります。これは、コールバック関数のメイン コードです。

JNIEnv *pEnv = NULL;
glJniContext.pJvm->AttachCurrentThread(&pEnv, NULL);
UiInkeyMsInternal(pEnv, 10000000);
glJniContext.pJvm->DetachCurrentThread();

AttachCurrentThreadサブ スレッドを JVM にアタッチし、UiInkeyMsInternalは Java メソッドを呼び出し、DetachCurrentThreadはサブ スレッドを JVM にデタッチし、glJniContext.pJvm次のようにネイティブ メソッド メソッドに格納されます。

JavaVM* gs_jvm;
pEnv->GetJavaVM(&gs_jvm);
glJniContext.pJvm = gs_jvm;

という行glJniContext.pJvm->DetachCurrentThread();で、プログラムがクラッシュします。しかし、線がなければそれは正常です。現象をどのように分析するか?

別の質問ですが、メソッドで JNIEnv 変数を正常に取得できますAttachCurrentThreadが、findClassメソッドが正常に実行されません。「java/lang/Thread」のように何を渡しても、0x00 が返されます。これは正常ですか、それとも無視できますか?

4

1 に答える 1

1

JNI handler functionmain から呼び出さないでくださいthread。メインスレッドから呼び出すJNI handler functionとクラッシュします。

于 2016-04-12T12:51:03.697 に答える