我有一个由我公司开发的私有库。它允许我设置一个回调函数,所以长时间操作完成后,回调将在子线程中调用。
我应该在回调中操作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。这是正常的还是我可以忽略它?