h-gen wraps the JNIEnv
pointer in a
class called IRMIFL::jni_env
. Any
JNIEnv
method that causes a Java exception causes
JNIEnv::ExceptionCheck
to return true
,
and causes JNIEnv::ExceptionOccurred
to return a
jthrowable
that represents the thrown
exception. IRMIFL::jni_env
methods call
JNIEnv::ExceptionCheck
after calling
JNIEnv
methods that might throw Java exceptions. If
JNIEnv::ExceptionCheck
returns true
jni_env
methods casts the jthrowable
to ::java::lang::Throwable *
and throws it as a C++
exception. This means that the follow code will catch any Java
exceptions that get thrown as a result of JNI calls through
jni_env
.
try { // Do some h-gen calls or direct jni_env calls // ... } catch (::java::lang::Throwable *t) { // Handle the exception or call // e->throw_object(t); // to reset the exception on the java side. // .. }
You may notice that all the h-gen generated thunk methods use this type of try/catch block to stop the C++ stack unwinding and reset the exception in the JNI layer.