目录
相关文章
Android NDK开发:java调用dll动态链接库方法
Android NDK开发:JNIEnv的原理
Android NDK开发:C修改Java的属性
Android NDK开发:C调用Java层方法
Android NDK开发:C创建Java层的对象
Android NDK开发:C操作Java层的数组
Android NDK开发:Native层的变量管理及静态缓存
Native层的异常处理
相关函数
用于检测异常的发生的函数有:
ExceptionCheck:检查是否发生了异常,若有异常返回JNI_TRUE,否则返回JNI_FALSE
ExceptionOccurred:检查是否发生了异常,若用异常返回该异常的引用,否则返回NULL
用于打印堆栈信息的有:
ExceptionDescribe:打印异常的堆栈信息
用于清理异常的有:
ExceptionClear:清除异常堆栈信息
用于跑出异常的有:
ThrowNew:在当前线程触发一个异常,并自定义输出异常信息
Throw:丢弃一个现有的异常对象,在当前线程触发一个新的异常
FatalError:致命异常,用于输出一个异常信息,并终止当前VM实例(即退出程序)
代码演示
C代码:
JNIEXPORT void JNICALL Java_com_itfitness_NdkDemo_exception
(JNIEnv* env, jclass jclazz,jobject jobj) {
//调用一个Java中抛出异常的方法,用于产生异常
jmethodID mid = (*env)->GetMethodID(env, jclazz, "callException", "()V");
(*env)->CallVoidMethod(env, jobj, mid);
//检测异常
jthrowable throwable = (*env)->ExceptionOccurred(env);
if (throwable) {
//清除异常
(*env)->ExceptionClear(env);
//创建Java层的异常并抛出
jclass j_exception = (*env)->FindClass(env,"java/lang/RuntimeException");
(*env)->ThrowNew(env, j_exception,"Test RuntimeException");
}
}
Java代码:
package com.itfitness;
public class NdkDemo {
static {
System.load("E:\\Project\\VS\\Jni异常处理\\x64\\Release\\Jni异常处理.dll");
}
public static void main(String[] args) {
try {
exception(new NdkDemo());
}catch (Exception e){
e.printStackTrace();
}
}
private void callException() throws RuntimeException{
throw new RuntimeException();
}
public native static void exception(NdkDemo ndkDemo) throws NoSuchMethodException;
}
运行结果:
注意
Jni中的函数好像只能捕捉Java层的异常,我试了几次从C语言代码中产生异常好像并不能捕捉。