调用DetachCurrentThread后崩溃

时间:2013-07-15 10:14:54

标签: multithreading android-ndk java-native-interface

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

我应该在回调中操作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。这是正常的还是我可以忽略它?

1 个答案:

答案 0 :(得分:1)

请勿从主JNI handler function致电thread。从主线程调用JNI handler function将导致崩溃。