博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android NDK开发之旅14 JNI 异常处理
阅读量:6238 次
发布时间:2019-06-22

本文共 3470 字,大约阅读时间需要 11 分钟。

###异常处理

异常测试例子:

public native void testException1();public static void main(String[] args) {    JniTest test = new JniTest();    try {        test.testException();        System.out.println("程序无法继续执行1,这句话不会被打印\n");    } catch (Throwable t) {        System.out.println("捕获到JNI抛出的异常(Throwable),这句话会被打印" + t.getMessage() + "\n");    }    System.out.println("程序继续执行2,这句话会被打印\n");}复制代码

C代码如下:

//异常处理JNIEXPORT void JNICALL Java_com_test_JniTest_testException1(JNIEnv * env, jobject jobj){    jclass clz=  (*env)->GetObjectClass(env, jobj);    //属性名字不小心写错了,拿到的是空的jfieldID    jfieldID fid = (*env)->GetFieldID(env, clz, "key1", "Ljava/lang/String;");    //此处抛出的异常,Java可以通过Throwable来捕获    printf("C can run , this will print");    //这里竟然还可以继续执行    jstring key =  (*env)->GetObjectField(env, jobj, fid);    //遇到这句话的时候,C程序Crash了    char* c_str = (*env)->GetStringUTFChars(env, key, NULL);    printf("C could not run , this will not print");}复制代码

通过例子可以知道,JNI层自己抛出的异常是Error类型,Java可以通过Throwable或者Error来捕获得到,捕获异常后Java代码可以继续执行下去。

#####为了确保Java、C/C++代码可以正常执行下去,需要:

在JNI层手动清空异常信息(ExceptionClear),保证代码可以运行。 补救措施保证C/C++代码继续运行。 例如:

//异常处理JNIEXPORT void JNICALL Java_com_test_JniTest_testException1(JNIEnv * env, jobject jobj){    jclass clz = (*env)->GetObjectClass(env, jobj);    //属性名字不小心写错了,拿到的是空的jfieldID    jfieldID fid = (*env)->GetFieldID(env, clz, "key1", "Ljava/lang/String;");    jthrowable err = (*env)->ExceptionOccurred(env);    if (err != NULL){        //手动清空异常信息,保证Java代码能够继续执行        (*env)->ExceptionClear(env);        //提供补救措施,例如获取另外一个属性        fid = (*env)->GetFieldID(env, clz, "key", "Ljava/lang/String;");    }    jstring key = (*env)->GetObjectField(env, jobj, fid);    char* c_str = (*env)->GetStringUTFChars(env, key, NULL);}复制代码

测试代码如下:

public static void main(String[] args) {    JniTest test = new JniTest();    try {        test.testException();        System.out.println("程序没有异常,这句话会被打印\n");    } catch (Exception e) {        System.out.println("没有捕获到JNI抛出的异常,这句话不会被打印" + e.getMessage() + "\n");    }    System.out.println("程序继续执行,这句话会被打印\n");}复制代码

用户可以手动通过ThrowNew函数抛出异常,同样可以被Java代码捕获:

//异常处理JNIEXPORT void JNICALL Java_com_test_JniTest_testException(JNIEnv * env, jobject jobj){    jclass clz = (*env)->GetObjectClass(env, jobj);    //属性名字不小心写错了,拿到的是空的jfieldID    jfieldID fid = (*env)->GetFieldID(env, clz, "key1", "Ljava/lang/String;");    jthrowable err = (*env)->ExceptionOccurred(env);    if (err != NULL){        //手动清空异常信息,保证Java代码能够继续执行        (*env)->ExceptionClear(env);        //提供补救措施,例如获取另外一个属性        fid = (*env)->GetFieldID(env, clz, "key", "Ljava/lang/String;");    }    jstring key = (*env)->GetObjectField(env, jobj, fid);    char* c_str = (*env)->GetStringUTFChars(env, key, NULL);    //参数不正确,程序员自己抛出异常,可以在Java中捕获    if (_stricmp(c_str,"efg") != 0){        jclass err_clz = (*env)->FindClass(env, "java/lang/IllegalArgumentException");        (*env)->ThrowNew(env, err_clz, "key value is invalid!");    }}复制代码

测试代码如下:

public static void main(String[] args) {    JniTest test = new JniTest();    try {        test.testException();        System.out.println("JNI手动抛出了异常,Java不会继续执行,这句话不会被打印\n");    } catch (Exception e) {        System.out.println("捕获到JNI手动抛出的异常,这句话会被打印:" + e.getMessage() + "\n");    }    System.out.println("程序继续执行,这句话会被打印\n");}复制代码

####异常处理总结

JNI自己抛出的异常,是Error类型,Java可以通过Throwable或者Error来捕获得到,捕获异常后Java代码可以继续执行下去。在C层可以清空(ExceptionClear),保证try中的代码Java代码继续执行,并且最好要提供补救措施,确保JNI层代码正常继续运行。 用户通过ThrowNew手动抛出的异常,同样可以在Java层捕捉得到。

转载地址:http://madia.baihongyu.com/

你可能感兴趣的文章
javascript解析json
查看>>
在Ubuntu下编译WebKit源码
查看>>
amazeui 移动开发
查看>>
python2 与python3中最大的区别(编码问题bytes&str
查看>>
HDU 2243 AC自动机+DP+矩阵
查看>>
什么叫脱字符合^
查看>>
git版本控制管理实践-2
查看>>
HTTP基础知识(三)
查看>>
如何有效释放DB2所占的磁盘空间?
查看>>
三分法
查看>>
第 8 章 容器网络 - 058 - flannel 概述
查看>>
Mongodb删除collection
查看>>
ArcEngine应用程序中无法实现TOC图层多选
查看>>
Java-笔记9-复习
查看>>
python---基本数据结构
查看>>
Windows下JDK,Tomcat,Eclipse安装配置
查看>>
vue的checkbox或多选的select的代码例子
查看>>
es6-Set和Map数据结构
查看>>
使用ffmpeg将录屏文件转换成gif
查看>>
作业七 总结
查看>>