JNI异常处理

异常处理是java程序设计语言的重要功能,JNI的异常行为与java的有所不同,在java中当抛出一个异常的时候,虚拟机停止执行代码并进入调用栈反向检查特定类型的异常。虚拟机清除异常并将控制权交给异常处理程序。相比之下JNI要求开发人员在异常发生后显示的实现异常处理流。


一,捕捉异常

抛出异常的java例子

public class JavaClass{
//抛出方法
private void throwingMethod() throws NullPointerException{
    throw new NullPointerException("NUll pointer");
 }
//访问原生方法
 private native void accessMethods();

}

二,原生代码中的异常处理

jthrowable ex;
(*env)->CallVoidMethod(env, instance, throwingMethod);
ex = (*env)->ExceptionOccurred(env);
if(0!=ex){
(*env)->ExceptionClear(env);
//在这里处理异常
}
/*
 *在调用throwingMethod方法时,accessMethod原生方法需要显示的做异常处理JNI提供了ExceptionOccurred函数查询虚拟机中是否有挂起的。在使用完之后,异常处理程序需要用ExceptionClear函数显示的清除异常。
 *
 */

一,抛出异常

JNI也允许远程代码抛出异常.因为异常时java类。应该先用FindClass函数找到异常类。用ThrowNew函数可以初始化并且抛出新的异常

/*
因为原生代码执行不受虚拟机得控制,因此抛出异常并不会停止原生函数的执行并把控制权交给异常处理程序。到异常抛出的时候,原生函数应该释放所有已分配的原生资源,例如内存及合适的返回值等,通过JNIEnv接口获得的引用是局部引用且一旦返回原生函数,他们自动的被虚拟机释放。
*/
jclass clazz;
clazz = (*env)->FindClass(env, "java/lang/NullPointerException");
if(0!=claszz){
(*env)->ThrowNew(env, clazz, "Exception message");

}

猜你喜欢

转载自blog.csdn.net/jeekmary/article/details/80074451