2.6 jni异常处理
jni函数在执行过程中会出现异常,其异常处理机制与java和c++都不一样。jni提供了两种检查异常的方法:
方法1 检查上一次 jni函数调用的返回值是否为null。
方法2 通过调用jni函数exceptionoccurred()来判断是否发生异常。
检查到异常后必须予以处理。处理异常的方法也有两种:
native方法可选择立即返回,这样异常就会在调用该native方法的java 代码中抛出。所以在java代码中必须有捕获相应异常的代码,否则程序直接退出。
native方法可以调用exceptionclear()来清除异常,然后执行自己的异常处理代码。
jni提供的检查和处理异常的函数如表2-5所示。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL3cTNzEWZ0E2M4QGMjJjZwkDOhJjYjFmNlJTOiZWY0MmY3MjZwMTO18CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
注意 异常出现后,native相关代码必须先检查清除异常,然后才能进行其他的 jni 函数调用。当有异常未被清除时,只有以下jni异常处理函数可被安全地调用:exceptionoccurred()、exceptiondescribe()?、exceptionclear()、exceptiondescribe()。
接下来,继续以log系统为例讲解jni的异常处理流程。先看以下代码:
static jboolean android_util_log_isloggable(jnienv env,
{
……
if (tag == null) {//异常流程,直接退出
}
jboolean result = false;
const char chars = env->getstringutfchars(tag, null);
if ((strlen(chars)+sizeof(log_namespace)) > property_key_max) {
从代码中并没有看到jni异常处理函数的调用。我们接着分析jnithrowexception方法。
该方法定义在jnihelp.h中,并在jnihelp.cpp中实现。代码如下:
extern "c" int jnithrowexception(c_jnienv env, const char classname, const char msg)
原来jnihelp.h中定义了jnithrowexception,它只是把异常处理函数做了一个封装,方便使用而已。
下一节将通过应用层jni使用的实例,把jni相关内容再复习一遍。