上一篇博客分析了JNI中的引用,以及在使用时需要注意的情况。Android NDK(六):局部引用和全局引用

本篇博客内容和大家唠唠JNI中对异常的处理。说起异常,大家肯定都不陌生。几乎每天都在跟bug,异常打交道。在Android中我们处理异常的方式一般都是:发现异常、捕获异常(向上层抛出异常)、处理异常。JNI中对于异常的处理和Andrid很相似。基本的流程都是检查异常,捕获异常,抛出异常,处理异常。我将大致内容分为如下展开:

 1. 异常检查

 2. 异常处理

 3. 抛出异常

很多情况下,本地代码做JNI调用后都要检查是否有错误发生,基本都在JNI函数调用引发的错误上。

一、异常检查

 检查一个异常是否发生有两种方式:

 (1)通过特定的返回值(比如NULL)来表示发生了一个错误,有一个异常需要处理。

 (2)调用JNI提供的ExceptionCheck来检查是否有异常发生。

来看一个实例:

  Android NDK(七):JNI异常处理_第1张图片

 在通过GetFieldID方法获取字段ID时,如果没有找到该字段,会返回NULL。所以我们就可以通过NULL来判断程序是否执行OK。同样,我们也可以通过ExceptionCheck检查是否有异常发生:

  Android NDK(七):JNI异常处理_第2张图片

如果有异常发生,则会返回JNI_TRUE。

二、异常处理

 在发生异常后,本地方法不会立刻终止,程序依然会继续执行,所以需要我们对异常进行相应处理,否则会发生不可预知的错误。本地方法中同样有两种方式来处理一个异常:

(1)一旦发生异常,立即返回,让调用者处理异常。

(2)通过ExceptionClear清除异常,执行自己的异常处理代码。

当一个异常发生后,必须先检查,处理,清除异常后再调用其他的JNI函数,并且在异常发生后,不要忘记释放资源。

  Android NDK(七):JNI异常处理_第3张图片

三、抛出异常

当我们自己不处理异常时,我们可以将异常抛出。抛出异常也分两种方式:

(1)抛出现有异常

(2)抛出新的异常

当本地方法中发生异常时,我们可以通过ExceptionOccurred方法来获取异常,该函数会返回jthrowable类型的异常对象。同样,我们可以调用JNI函数的Throw方法将其抛出:

 

如果我们想抛出某个指定的异常,可以调用JNI函数的ThrowNew方法抛出新的异常,例如,我们可以定义一个异常工具类,传入异常名,异常信息,函数就抛出一个异常:

  Android NDK(七):JNI异常处理_第4张图片

例如抛出一个空指针异常,那么name就为:java/lang/NullPointerException

JNI中为我们提供了ExceptionDescribe方法来输出异常的描述信息,可以查看具体的异常详情:

 

最后,我们以回调方法来看一个系统的例子:

  Android NDK(七):JNI异常处理_第5张图片

 在上述代码中,我们首先通过GetMethodID来获取show方法的ID,并通过CallVoidMethod方法进行回调。然后通过ExceptionOccured方法捕获异常,如果存在异常,那么通过ExceptionDescribe方法打印异常信息,并且通过ExceptionClear方法清除异常,自己定义一个新的异常类,然后调用ThrowNew抛出。

以上就是JNI中关于异常处理的内容,妥善的处理异常有时候很繁琐,但是一个高质量的程序是不可或缺的。下一篇内容将和大家分享JNI中对于多线程的处理操作。Android NDK(八):JNI多线程


更多相关文章

  1. Android开发人员看过来:这些Kotlin化方法帮你提高开发技能
  2. Android 在onCreate()方法中获取控件宽高值为0解决方案
  3. Android录制屏幕的实现方法
  4. Android简单修改原有应用和添加应用的方法
  5. android下调用lua脚本方法
  6. android调用webservice方法,参数和返回值都用字符串
  7. Android中View转换为Bitmap及getDrawingCache=null的解决方法
  8. strcpy函数在android中的实现

随机推荐

  1. Centos6.8下编译安装Apache 2.4.25详细过
  2. 通过iptables分析OpenStack 安全组规则
  3. 大数据的产生和力量
  4. NFV场景下优化KVM--低时延
  5. Prometheus(普罗米修斯)用户档案:动态化特性
  6. 打造立体化监控体系与APM最佳实践系列 --
  7. 一文读懂OpenStack Glance是什么
  8. 工业平板电脑在医院自助设备中的广泛应用
  9. 一键批量查询快递物流信息的软件有哪种
  10. 互联网企业网络信息安全实践