У меня есть личная библиотека, разработанная моей компанией. Это позволило мне установить функцию обратного вызова, поэтому после завершения длительной операции обратный вызов будет вызван в подпотоке.Сбой после вызова 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. Это нормально или я могу игнорировать его?
Предполагая, что 'glJniContext.pJvm' действителен, код кажется прекрасным. (Возможно, вы захотите проверить возвращаемое значение на 'GetJavaVM' и' AttachCurrentThread'.) Что показывает вывод logcat при его сбое? (Используйте 'adb logcat' или вид logcat в ADT/DDMS.) – fadden
Спасибо за совет. Я проверил оба параметра «AttachCurrentThread» и «GetJavaVM», их возврат равен 0 (нормальный). Странно, что программа работает сегодня нормально, это, скажем, не сбой. Код не изменяется, только компьютер и устройство перезагружаются. Поэтому у меня нет прямого способа проанализировать причину. – johnnyfee
@johnnyfee Внезапно у меня такие же симптомы в одном из моих проектов: 'findClass' возвращает 0 и' DetachCurrentThread' терпит неудачу. Вам удалось решить вашу ситуацию? – deko