JNI异常和Java异常有一点很重要的区别是:

当Java中发生异常时如果没有使用try…catch来捕获,会导致程序Crash这种情况下后续的代码不会被执行。而在调用JNI接口的时候如果发生异常那么后续的代码不会停止,还会继续往下执行,所以在这种情况下需要使用return退出后续执行。
下面是一个很典型的异常处理代码片段:

JNIEXPORT void JNICALL
Java_com_idealist_myapplication_MainActivity_callMethodWithException(JNIEnv *env,
jobject instance) {
//调用会抛出异常的方法
jclass cls = (*env)->GetObjectClass(env,instance);
jmethodID methodid = (*env)->GetMethodID(env,cls,"methodWithException","()V");
(*env)->CallVoidMethod(env, instance, methodid);

//检查调用上述方法后异常是否抛出
jthrowable exception = (*env)->ExceptionOccurred(env);
//如果有异常
if(exception) {
//释放资源
(*env)->DeleteLocalRef(env,cls);
//打印异常信息
(*env)->ExceptionDescribe(env);
//清除异常
(*env)->ExceptionClear(env);
//抛出自定义的异常
jclass exclass = (*env)->FindClass(env, "java/lang/Exception");
if (exclass == NULL) {
return;
}
(*env)->ThrowNew(env, exclass, "Here is a Exception Occur!");
//将程序流终止,这里由于是最后了所以可以省略,但是如果不是处于最后那么一定不要忘记添加return终止程序运行。
return;
}
}
Contents