3

我有一个由我公司开发的私有库。它允许我设置一个回调函数,所以长时间操作完成后,回调将在子线程中调用。

我应该在回调中操作JVM。这是我在回调函数中的主要代码:

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

AttachCurrentThread子线程附加到JVM,UiInkeyMsInternal调用Java方法,DetachCurrentThread将子线程分离到JVM,glJniContext.pJvm存储在native方法方法中,如下所示:

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 function从 main调用thread。从主线程调用JNI handler function会导致崩溃。

于 2016-04-12T12:51:03.697 回答