2013-07-15 5 views
3

У меня есть личная библиотека, разработанная моей компанией. Это позволило мне установить функцию обратного вызова, поэтому после завершения длительной операции обратный вызов будет вызван в подпотоке.Сбой после вызова DetachCurrentThread

Я должен использовать JVM в обратном вызове. Это мой основной код в функции обратно вызова:

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

AttachCurrentThread является присоединить к югу нить к JVM, то UiInkeyMsInternal является вызов метода Java, и DetachCurrentThread является отделить суб нить для виртуальной машины Java и glJniContext.pJvm хранится в родном методе метода, как это:

JavaVM* gs_jvm; 
pEnv->GetJavaVM(&gs_jvm); 
glJniContext.pJvm = gs_jvm; 

с линией glJniContext.pJvm->DetachCurrentThread();, программа потерпит крах. Но без линии это нормально. Как анализировать явление?

Другой вопрос, я могу получить переменную JNIEnv по методу AttachCurrentThread обычно, но метод findClass не выполняется нормально. Независимо от того, что я прохожу, например «java/lang/Thread», он вернет 0x00. Это нормально или я могу игнорировать его?

+0

Предполагая, что 'glJniContext.pJvm' действителен, код кажется прекрасным. (Возможно, вы захотите проверить возвращаемое значение на 'GetJavaVM' и' AttachCurrentThread'.) Что показывает вывод logcat при его сбое? (Используйте 'adb logcat' или вид logcat в ADT/DDMS.) – fadden

+0

Спасибо за совет. Я проверил оба параметра «AttachCurrentThread» и «GetJavaVM», их возврат равен 0 (нормальный). Странно, что программа работает сегодня нормально, это, скажем, не сбой. Код не изменяется, только компьютер и устройство перезагружаются. Поэтому у меня нет прямого способа проанализировать причину. – johnnyfee

+0

@johnnyfee Внезапно у меня такие же симптомы в одном из моих проектов: 'findClass' возвращает 0 и' DetachCurrentThread' терпит неудачу. Вам удалось решить вашу ситуацию? – deko

ответ

1

Не звоните JNI handler function от thread. Вызов JNI handler function из основного потока приведет к сбою.

Смежные вопросы