天天看点

《Android的设计与实现:卷I》——第2章 2.6JNI异常处理

2.6 jni异常处理

jni函数在执行过程中会出现异常,其异常处理机制与java和c++都不一样。jni提供了两种检查异常的方法:

方法1 检查上一次 jni函数调用的返回值是否为null。

方法2 通过调用jni函数exceptionoccurred()来判断是否发生异常。

检查到异常后必须予以处理。处理异常的方法也有两种:

native方法可选择立即返回,这样异常就会在调用该native方法的java 代码中抛出。所以在java代码中必须有捕获相应异常的代码,否则程序直接退出。

native方法可以调用exceptionclear()来清除异常,然后执行自己的异常处理代码。

jni提供的检查和处理异常的函数如表2-5所示。

《Android的设计与实现:卷I》——第2章 2.6JNI异常处理

注意 异常出现后,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相关内容再复习一遍。