前言
按照java的经验,当发生异常而又没有捕获时,异常后面的代码就得不到继续执行的机会,但是在JNI中不同,在JNI中如果调用java层的方法抛出了异常,依然会继续往后执行,但是这些行为往往会带来各种各样的"惊喜"。。。因此我们需要在异常发生时将这些异常及时进行处理。
本文主要从捕获java层异常、向java层抛出异常两个方面介绍JNI中的异常处理机制。
捕获java层异常
当Native调用java层发生异常时可以通过函数检测是否有发生异常,通过函数输出异常描述信息,如果检测到异常处理完毕或者不进行异常处理又想让程序继续往下执行,那么通过函数将异常清除即可。
检测是否有异常时还可以使用函数,它与函数的作用类似,不同之处在于函数不会返回异常对象的引用,而是返回一个异常是否发生的jboolean标识,当返回的标识为JNI_TRUE时代表有异常发生。当调用者不关心异常的类型,仅仅关心是否发生了异常的时候,使用它会更加方便而且高效。
向java层抛出异常
当希望将捕获到的异常向java层继续抛出时,可以通过JNI函数抛出一个异常,这个异常可以被java层的try catch语句块捕获到。
以下是一个在Native层捕获到一个除数为0的异常,并将其抛出给java层的demo:
NumUtils.java
MainActivity.java
native-lib.cpp
小结
1、为了更好地在Native层处理好异常,一般建议在调用等一系列函数之后进行异常检测。
2、在设计供Native层调用的函数时尽可能地带上返回值,方便Native层按照返回值判断是否需要处理异常等。
3、当捕获到异常需要提前return程序时需要保证各种资源及时释放。
4、为了简化抛出异常的方法《JNI编程指南》一书中给出了一个工具函数:
系列推荐
关注我,一起进步,人生不止coding!!!
领取专属 10元无门槛券
私享最新 技术干货