I'm new to JNI. I'm trying exception handling in Cpp. For the class not found exception I'm able to handle the exception as below
jclass some=env->FindClass("java/some/class"); jboolean flag = env->ExceptionCheck(); if (flag) { env->ExceptionClear(); printf("Exception in native method"); jclass jcls =env->FindClass("java/lang/ClassNotFoundException"); env->ThrowNew(jcls, "Exception in Native Method"); }
But for methodid if I give the wrong methodName it doesn't throws exception.
jmethodID mId = env->GetMethodID( someClass, "wrongmethodName", "()V"); jboolean flag = env->ExceptionCheck(); if (flag) { env->ExceptionClear(); printf("Exception in native method"); jclass jcls =env->FindClass("java/lang/Exception"); env->ThrowNew(jcls, "Exception in Native Method"); }
Instead JVM crashes and generates log file as hs_err_pidxxx.txt containing the following
# # A fatal error has been detected by the Java Runtime Environment: # # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x63c7e45b, pid=30652, tid=0x00009098 # # JRE version: Java(TM) SE Runtime Environment (8.0_181-b13) (build 1.8.0_181-b13) # Java VM: Java HotSpot(TM) Client VM (25.181-b13 mixed mode, sharing windows-x86 ) # Problematic frame: # V [jvm.dll+0xde45b] # # Failed to write core dump. Minidumps are not enabled by default on client versions of Windows # # If you would like to submit a bug report, please visit: # http://bugreport.java.com/bugreport/crash.jsp # --------------- T H R E A D --------------- Current thread (0x193d7800): JavaThread "http-nio-8080-exec-2" daemon [_thread_in_vm, id=37016, stack(0x19cb0000,0x19d00000)] siginfo: ExceptionCode=0xc0000005, reading address 0x00000000 Registers: EAX=0x00000000, EBX=0x193d7940, ECX=0x193d7800, EDX=0x0000062d ESP=0x19cff040, EBP=0x19cff088, ESI=0x193d7800, EDI=0x00000000 EIP=0x63c7e45b, EFLAGS=0x00010246 Top of Stack: (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 Instructions: (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 Register to memory mapping: EAX=0x00000000 is an unknown value EBX=0x193d7940 is an unknown value ECX=0x193d7800 is a thread EDX=0x0000062d is an unknown value ESP=0x19cff040 is pointing into the stack for thread: 0x193d7800 EBP=0x19cff088 is pointing into the stack for thread: 0x193d7800 ESI=0x193d7800 is a thread EDI=0x00000000 is an unknown value Stack: [0x19cb0000,0x19d00000], sp=0x19cff040, free space=316k Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) V [jvm.dll+0xde45b] C [crud.dll+0x2dd8] C [crud.dll+0x1b74] j NativeService.view(LUser;)Ljava/util/ArrayList;+0
Can anyone please suggest me a way to handle the exception instead of JVM crash and generation of error log. A bunch of thanks.
User contributions licensed under CC BY-SA 3.0