我有一个由我公司开发的私有库。它允许我设置一个回调函数,所以在长时间操作完成后,将在子线程中调用回调。
我应该在回调中操作JVM。这是我回调函数中的主要代码:
JNIEnv *pEnv = NULL;
glJniContext.pJvm->AttachCurrentThread(&pEnv, NULL);
UiInkeyMsInternal(pEnv, 10000000);
glJniContext.pJvm->DetachCurrentThread();
AttachCurrentThread
是将子线程附加到JVM,UiInkeyMsInternal
是调用Java方法,DetachCurrentThread
是将子线程分离到JVM,{ {1}}存储在本机方法方法中,如下所示:
glJniContext.pJvm
使用行JavaVM* gs_jvm;
pEnv->GetJavaVM(&gs_jvm);
glJniContext.pJvm = gs_jvm;
,程序将崩溃。但没有线,这是正常的。如何分析这种现象?
另一个问题是,我可以通过glJniContext.pJvm->DetachCurrentThread();
方法正常获取JNIEnv变量,但AttachCurrentThread
方法无法正常执行。无论我传递什么,比如“java / lang / Thread”,它都会返回0x00。这是正常的还是我可以忽略它?
答案 0 :(得分:1)
请勿从主JNI handler function
致电thread
。从主线程调用JNI handler function
将导致崩溃。