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.