这个JNIENV接口提供了一套与异常相关的函数。
public class JavaClass {
/**
* Throwing method.
*/
private void throwingMethod() throws NullPointerException {
throw new NullPointerException("Null pointer");
}
/**
* Access methods native method.
*/
private native void accessMethods();
}
这个accessMethods本地方法需要明确的做异常处理,当调用throwingMethod方法。这个JNI提供了ExceptionOccurred方法来查询虚拟机是否有异常。这个异常处理需要明确的使用ExceptionClear函数来清除它。
jthrowable ex;
...
(*env)->CallVoidMethod(env, instance, throwingMethodId);
ex = (*env)->ExceptionOccurred(env);
if (0 != ex) {
(*env)->ExceptionClear(env);
/* Exception handler. */
}
抛出异常
这JNI允许本地的代码来抛出异常。因为异常时Java类,这必须首先使用FindClass函数来获得。这个ThrowNew函数能够被用来初始化和抛出这新的异常。
jclass clazz;
...
clazz = (*env)->FindClass(env, "java/lang/NullPointerException");
if (0 ! = clazz) {
(*env)->ThrowNew(env, clazz, "Exception message.");
}
本地函数的代码执行并不在虚拟机的控制下,抛出一个异常并不会阻止本地函数的执行和把控制转到异常处理器。基于抛出的 异常,本地方法应该释放任何已经分配的本地资源,例如内存等。