博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《Android的设计与实现:卷I》——第2章 2.6JNI异常处理
阅读量:6255 次
发布时间:2019-06-22

本文共 1658 字,大约阅读时间需要 5 分钟。

2.6 JNI异常处理

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

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

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

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

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

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

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

image

注意 异常出现后,Native相关代码必须先检查清除异常,然后才能进行其他的 JNI 函数调用。当有异常未被清除时,只有以下JNI异常处理函数可被安全地调用:ExceptionOccurred()、ExceptionDescribe()?、ExceptionClear()、ExceptionDescribe()。

接下来,继续以Log系统为例讲解JNI的异常处理流程。先看以下代码:

static jboolean android_util_Log_isLoggable(JNIEnv env,

jobject clazz, jstring tag, jint level)

{

……

if (tag == NULL) {//异常流程,直接退出

return false;

}

jboolean result = false;
const char chars = env->GetStringUTFChars(tag, NULL);
if ((strlen(chars)+sizeof(LOG_NAMESPACE)) > PROPERTY_KEY_MAX) {

……    // 异常流程,释放资源,抛出异常    env->ReleaseStringUTFChars(tag, chars);    jniThrowException(env, "java/lang/IllegalArgumentException", buf2);    return false;} else {//正常流程    result = isLoggable(chars, level);}env->ReleaseStringUTFChars(tag, chars);return result;

}

从代码中并没有看到JNI异常处理函数的调用。我们接着分析jniThrowException方法。

该方法定义在JNIHelp.h中,并在JNIHelp.cpp中实现。代码如下:
extern "C" int jniThrowException(C_JNIEnv env, const char className, const char msg)
{

JNIEnv e = reinterpret_cast
(env);if ((env)->ExceptionCheck(e)) {//判断发生异常 scoped_local_ref
exception(env, (*env)->ExceptionOccurred(e)); (*env)->ExceptionClear(e);//得到异常引用并清除异常 if (exception.get() != NULL) { char text = getExceptionSummary(env, exception.get()); free(text); }}

原来JNIHelp.h中定义了jniThrowException,它只是把异常处理函数做了一个封装,方便使用而已。

下一节将通过应用层JNI使用的实例,把JNI相关内容再复习一遍。

转载地址:http://onasa.baihongyu.com/

你可能感兴趣的文章
LinearLayout布局
查看>>
java 的 (PO,VO,TO,BO,DAO,POJO) 解释
查看>>
基本计数方法
查看>>
Mock.js:前后端分离开发工具
查看>>
内容循环滚动的表格
查看>>
Catalyst揭秘 Day7 SQL转为RDD的具体实现
查看>>
【转载】小公司如何管理
查看>>
DOM笔记(十):JavaScript正则表达式
查看>>
关于贴友的一个书本页面简单布局(html+css)的实现
查看>>
input 内容发生改变时触发事件
查看>>
IOS之表视图单元格删除、移动及插入
查看>>
转载翻译简介:关于Flash and C++ Native Extension C++扩展ANE——2
查看>>
【Android】10.4 卡片视图
查看>>
虚化技术的额外开销
查看>>
JS 中 call 和 apply 的理解和使用
查看>>
Codeforces Round #256 (Div. 2)
查看>>
20172309_《程序设计与数据结构(下)》_课堂测试修改报告。
查看>>
Linux发邮件之mail命令
查看>>
113 - Power of Cryptography 浮点数 pow()函数
查看>>
ES6中的Promise使用方法与总结
查看>>