Android NDK(七):JNI异常处理
上一篇博客分析了JNI中的引用,以及在使用时需要注意的情况。Android NDK(六):局部引用和全局引用
本篇博客内容和大家唠唠JNI中对异常的处理。说起异常,大家肯定都不陌生。几乎每天都在跟bug,异常打交道。在Android中我们处理异常的方式一般都是:发现异常、捕获异常(向上层抛出异常)、处理异常。JNI中对于异常的处理和Andrid很相似。基本的流程都是检查异常,捕获异常,抛出异常,处理异常。我将大致内容分为如下展开:
1. 异常检查
2. 异常处理
很多情况下,本地代码做JNI调用后都要检查是否有错误发生,基本都在JNI函数调用引发的错误上。
一、异常检查
检查一个异常是否发生有两种方式:
(1)通过特定的返回值(比如NULL)来表示发生了一个错误,有一个异常需要处理。
(2)调用JNI提供的ExceptionCheck来检查是否有异常发生。
来看一个实例:
在通过GetFieldID方法获取字段ID时,如果没有找到该字段,会返回NULL。所以我们就可以通过NULL来判断程序是否执行OK。同样,我们也可以通过ExceptionCheck检查是否有异常发生:
如果有异常发生,则会返回JNI_TRUE。
二、异常处理
在发生异常后,本地方法不会立刻终止,程序依然会继续执行,所以需要我们对异常进行相应处理,否则会发生不可预知的错误。本地方法中同样有两种方式来处理一个异常:
(1)一旦发生异常,立即返回,让调用者处理异常。
(2)通过ExceptionClear清除异常,执行自己的异常处理代码。
当一个异常发生后,必须先检查,处理,清除异常后再调用其他的JNI函数,并且在异常发生后,不要忘记释放资源。
三、抛出异常
当我们自己不处理异常时,我们可以将异常抛出。抛出异常也分两种方式:
(1)抛出现有异常
(2)抛出新的异常
当本地方法中发生异常时,我们可以通过ExceptionOccurred方法来获取异常,该函数会返回jthrowable类型的异常对象。同样,我们可以调用JNI函数的Throw方法将其抛出:
如果我们想抛出某个指定的异常,可以调用JNI函数的ThrowNew方法抛出新的异常,例如,我们可以定义一个异常工具类,传入异常名,异常信息,函数就抛出一个异常:
例如抛出一个空指针异常,那么name就为:java/lang/NullPointerException
JNI中为我们提供了ExceptionDescribe方法来输出异常的描述信息,可以查看具体的异常详情:
最后,我们以回调方法来看一个系统的例子:
在上述代码中,我们首先通过GetMethodID来获取show方法的ID,并通过CallVoidMethod方法进行回调。然后通过ExceptionOccured方法捕获异常,如果存在异常,那么通过ExceptionDescribe方法打印异常信息,并且通过ExceptionClear方法清除异常,自己定义一个新的异常类,然后调用ThrowNew抛出。
以上就是JNI中关于异常处理的内容,妥善的处理异常有时候很繁琐,但是一个高质量的程序是不可或缺的。下一篇内容将和大家分享JNI中对于多线程的处理操作。Android NDK(八):JNI多线程
更多相关文章
- Android开发人员看过来:这些Kotlin化方法帮你提高开发技能
- Android 在onCreate()方法中获取控件宽高值为0解决方案
- Android录制屏幕的实现方法
- Android简单修改原有应用和添加应用的方法
- android下调用lua脚本方法
- android调用webservice方法,参数和返回值都用字符串
- Android中View转换为Bitmap及getDrawingCache=null的解决方法
- strcpy函数在android中的实现