Обрабатывать EXCEPTION_ACCESS_VIOLATION в JNI с помощью Java
Я новичок в JNI. Я пытаюсь обработать исключения в Cpp. Для класса не найдено исключение, я могу обработать исключение, как показано ниже
jclass some=env->FindClass("java/some/class"); jboolean flag = env->ExceptionCheck(); if (flag) { env->ExceptionClear(); printf("Исключение в нативном методе"); jclass jcls =env->FindClass("java/lang/ClassNotFoundException"); env->ThrowNew(jcls, "Исключение в родном методе"); }
Но для methodid, если я укажу неправильный methodName, он не выдает исключение.
jmethodID mId = env-> GetMethodID (someClass, "errormethodName", "()V"); jboolean flag = env->ExceptionCheck(); if (flag) { env->ExceptionClear(); printf("Исключение в нативном методе"); jclass jcls =env->FindClass("java/lang/Exception"); env->ThrowNew(jcls, "Исключение в родном методе"); }
Вместо этого JVM аварийно завершает работу и генерирует файл журнала в виде hs_err_pidxxx.txt, содержащий следующие
# # В среде выполнения Java обнаружена фатальная ошибка: # # EXCEPTION_ACCESS_VIOLATION (0xc0000005) при pc=0x63c7e45b, pid=30652, tid=0x00009098 # # Версия JRE: среда выполнения Java(TM) SE (8.0_181-b13) (сборка 1.8.0_181-b13) # Java VM: клиентская виртуальная машина Java HotSpot(TM) (смешанный режим 25.181-b13, совместное использование windows-x86) # Проблемный кадр: # V [jvm.dll+0xde45b] # # Не удалось записать ядро свалка. Мини-дампы не включены по умолчанию в клиентских версиях Windows # # Если вы хотите отправить отчет об ошибке, посетите: # http://bugreport.java.com/bugreport/crash.jsp # --------------- T H R E A D --------------- Текущий поток (0x193d7800): JavaThread "http-nio-8080-exec-2" демон [_thread_in_vm, id=37016, stack(0x19cb0000,0x19d00000)] siginfo: ExceptionCode=0xc0000005, адрес чтения 0x00000000 Регистры: EAX=0x00000000, EBX=0x193d7940, ECX=0x193d7800, EDX=0x0000062d ESP=0x19d00 = 0x0 0x0 0 0 0 0 0 0 0 = 0 0 = 0 0 = 0x = 0x0 = 0x0 = 0x0x0x0x0x0x0: 0x0x0x0x0x0x0x0x0 0x63c7e45b, EFLAGS=0x00010246 вершине стека: (SP=0x19cff040) 0x19cff040: 193d7800 18dd0880 18dd0888 63e87cf4 0x19cff050: 176397f0 193d7800 00000000 0000000e 0x19cff060: 19cfefdc 19cff0d4 0000000e 193d7800 0x19cff070: 00000007 18dd0888 193d7800 17e1cbc4 0x19cff080: 0000062d 63e87bc8 19cff0b8 6af82dd8 0x19cff090: 193d7940 18a00b14 00000000 19cff0cc 0x19cff0a0: 74ca2fcb 74cae600 19cff0cc 19cff0cc 0x19cff0b0: 00000000 19cff0c8 19cff238 6af81b74 Инструкция s: (pc = 0x63c7e45b) 0x63c7e43b: f2 ff 83 c4 08 83 7e 04 00 89 75 f0 c7 45 f4 00 0x63c7e44b: 00 00 00 74 08 8d 4d f0 e8 08 c3 0c 00 8b 7d 10 0x63c7e45b: 8b 07 c7 45 e0 04 00 00 00 8b 40 04 0f b7 48 1c 0x63c7e46b: 8b 50 08 8b 44 8a 2c 50 8d 4d c4 e8 b5 5e 09 00 Регистрация в отображении памяти: EAX = 0x00000000 - неизвестное значение EBX = 0x193d7940 - неизвестное значение ECX = 0x193d7800 - это поток EDX = 0x0000062d - это неизвестное значение ESP=0x19cff040 указывает на стек для потока: 0x193d7800 EBP=0x19cff088 - указывает на стек для потока: 0x193d7800 ESI=0x193d7800 - это поток EDI=0x000000: неизвестно, значение Stax = 0x000000: [0x19cb0000,0x19d00000], sp=0x19cff040, свободное пространство =316k Собственные кадры: (J= скомпилированный код Java, j= интерпретированный, Vv= код VM, C= собственный код) V [jvm.dll+0xde45b] C [crud.dll+0x2dd8] C [crud.dll+0x1b74] j NativeService.view(LUser;)Ljava/util/ArrayList;+0
Может кто-нибудь, пожалуйста, предложите мне способ обработки исключения вместо сбоя JVM и создания журнала ошибок. Большое спасибо.