五.处理本机代码中的异常

为了处理以Java代码实现的方法执行中抛出的异常,或者是以本机代码编写的方法抛出的Java异常,JNI提供了Java异常机制的钩子程序。该机制与C/C++中常规函数实现的标准错误处理无关。JNI提供一个函数集来在本机代码中检查、分析和处理Java异常。

(1).如果一个异常已经抛出,下面的函数返回JNI_TRUE,否则返回JNI_FALSE:

jboolean ExceptionCheck();

/*如:当异常发生时,清理并抛出自定义异常*/
if(env->ExceptionCheck())
{
  env->ExceptionClear();//清除异常
  env->ThrowNew(env->FindClass("java/lang/Exception"),"xx异常");
}

(2).ExceptionOccurred函数获取正在被抛出异常的一个本地引用。本机代码或者Java代码必须处理该异常:

jthrowable ExceptionOccurred();

(3).ExceptionDescribe函数打印有关刚刚被抛出到标准错误输出中的异常信息。该信息包括一个栈追踪信息:

void ExceptionDescribe();

(4).ExceptionClear函数清理一个刚刚抛出的异常:

void ExceptionClear();

(5).Throw 函数抛出一个已经创建的异常。如果异常成功抛出,返回0;否则返回一个负值:

jint Throw(jthrowable obj);

/*可以这样使用:手动抛出异常,然后在本机或Java代码中处理*/
jthrowable mException = NULL;
mException = env->ExceptionOccurred();
if (mException != NULL) {
       env->Throw(mException);
/*或抛出自定义异常
       env->ThrowNew(env->FindClass("java/lang/Exception"),
               "xxx异常"); */
//最后别忘了清除异常,不然还是会导致VM崩溃
       env->ExceptionClear();
return -1;
   }

(6).ThrowNew函数基于clazz创建一个异常,它应该是继承自Throwable,并且异常文本是由msg(按照UTF-8)指定。如果异常的构造以及抛出成功,返回0;否则返回一个负值。

jint ThrowNew(jclass clazz,constchar *msg);

/*如:在可能出错的地方抛出自定义异常,然后在本机代码或者Java代码中处理*/
env->ThrowNew(env->FindClass("java/lang/Exception"),
               "xxx异常");

(7)FatalError函数会生成致命错误信号。一个致命错误是特指无法恢复的情况。VM在调用该函数之后将会关闭:

void FatalError(constchar *msg);

转载于:https://blog.51cto.com/huihui88/1399266

Android JNI开发摘录(四)之JNI异常处理相关推荐

  1. JNI开发笔记(四)--实现一个简单的JNI工程并生成so库

    实现一个简单的JNI工程并生成so库 引 前言 1. 编写C/h文件并添加到工程 2. 修改CmakeLists.txt文件 3. 编写native-lib.cpp文件 4. 在MainActivit ...

  2. Android Studio开发(四)SQLite数据库的DAO标准CRUD操作模拟微信通讯录

    Android Studio开发(四)SQLite数据库的DAO标准CRUD操作模拟微信通讯录 Android Studio开发(四)SQLite数据库的DAO标准CRUD操作模拟微信通讯录 一.任务 ...

  3. Android JNI开发摘录(五)之对象引用处理

    六.本机代码中的对象引用 终于讲到对象引用了,在此推荐JNI开发必看的 使用 Java Native Interface 的最佳实践 JNI提供了函数集来使用本机代码中的Java对象,包括前面已经介绍 ...

  4. android 串口开发第二篇:利用jni实现android和串口通信

    一:串口通信简介 由于串口开发涉及到jni,所以开发环境需要支持ndk开发,如果未配置ndk配置的朋友,或者对jni不熟悉的朋友,请查看上一篇文章,android 串口开发第一篇:搭建ndk开发环境以 ...

  5. 【Android游戏开发十四】深入Animation,在SurfaceView中照样使用Android—Tween Animation!

     李华明Himi 原创,转载务必在明显处注明: 转载自 [黑米GameDev街区] 原文链接:  http://www.himigame.com/android-game/331.html 很多童鞋说 ...

  6. JNI开发笔记(二)--创建JNI基础工程并运行

    创建JNI基础工程并运行 引 1. 创建JNI工程 2. 添加虚拟手机设备 3. 运行JNI基础工程 引 JNI开发笔记(一)–Android Studio安装与环境搭建 1. 创建JNI工程 And ...

  7. 【Android游戏开发十四】深入Animation,在SurfaceView中照样使用Android—Tween Animation!...

    本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/331.html 之 ...

  8. Android 音频开发(四) 如何播放一帧音频数据下

    再看这一篇文章前,如果你是小白,我建议你先看一下Android 音频开发(一) 基础入门篇这一篇.今天继续讲解如何通过Android SDK自带API实现播放一帧音频数据. 我们都知道,Android ...

  9. 【学习Android NDK开发】Java通过JNI调用native方法

    参考:Android NDK,sample/hello-jni示例项目 系统环境:Ubuntu 12.04 LTS 32-bit 1.准备工作 打开Eclipse,新建Android项目: Appli ...

最新文章

  1. 转:mybatis - 分页功能
  2. 怎么查看电脑硬盘序列号
  3. ESP8266开发笔记
  4. 计算机电缆2x2x1.5,计算机电缆djypvp1x2x1.5
  5. python异步框架twisted_Python学习八十七天:使用异步的twisted框架写入数据
  6. 陶哲轩实分析定理11.9.1:微积分第一基本定理(二)
  7. android 之反编译
  8. swift实例教程_Swift示例教程基础
  9. ppt上的倒计时小工具_英孚线上精品小班课平台操作指南这些课堂小工具你都知道吗?更多课前指引看这里!...
  10. Java编程:爬楼梯问题、斐波那契数列问题
  11. 营收增长“疫”外超预期,走向手游化的动视暴雪能否弯道超车?
  12. PopClip 能让像苹果电脑像 iOS 一样选中文字后弹出搜索、复制、粘贴等选项
  13. 《软件工程之美》打卡第六周
  14. 基于LabVIEW的音频信号采集分析系统
  15. EcmaScript 2022中的新特性
  16. ffmpeg 裁剪视频
  17. C语言程序——小写字母转换成大写字母
  18. xp系统关闭闲置服务器,教你win10系统空闲进程占用cpu怎么关闭
  19. CSS实战样式:文字两侧加居中横线
  20. 电脑代理服务器出现问题的解决办法

热门文章

  1. 图解opengl曲线和曲面绘制
  2. for,while循环
  3. UIScrollView的代理方法(delegate)
  4. 参数化查询(简单举例)
  5. 自己写一个树形导航菜单
  6. java--uploadify3.1多文件上传
  7. poj 1716 差分约束
  8. 久违了我的博客园《人生的体会》
  9. can't find a register in class `GENERAL_REGS' while reloading `asm'
  10. 今天被编码搞惨了,页面和脚本的编码一致性