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

我应该在回调中操作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();处,程序将崩溃。但是没有界限,这很正常。如何分析现象?

另一个问题,我可以通过AttachCurrentThread方法正常获取JNIEnv变量,但是findClass方法不能正常执行。无论我通过什么,例如“java/lang/Thread”,它将返回0x00。这是正常现象还是我可以忽略?

最佳答案

不要从主JNI handler function调用thread。从主线程调用JNI handler function将导致崩溃。

09-05 11:44