Android NDK开发篇:Java与原生代码通信(异常处理)
一、捕获异常
异常处理是Java中的功能,在Android中使用SDK进行开发的时候经常要用到。Android原生代码在执行过程中如果遇到错误,需要检测,并抛出异常给Java层。执行原生代码出现了问题,例如使用了空指针、内存泄漏,并且没有做相应的检测盒异常抛出,APP会马上闪退,没有任何提示。
JNI中的异常处理和Java的不一样。Java中的异常处理,是直接捕获,然后做相应的处理。JNI要求开发人员在异常发生之后显式实现异常处理流。例如以下例子:
- public class JavaClass {
- /**
- * 异常抛出方法
- */
- private void throwException() throws NullPointerException {
- throw new NullPointerException("Null pointer");
- }
- /**
- * 原生方法
- */
- private native void nativeMethod();
- }
在原生方法nativeMethod中调用throwException方法,nativeMethod原生方法需要显示地做异常处理。JNI提供了ExceptionOccurred函数查询虚拟机是否有挂起的异常。在使用完之后,还需要ExceptionClear函数显式地清除异常。
- jthrowable ex;
- //...
- (*env)->CallVoidMethod(env, instance, throwExceptionId);
- ex = (*env)->ExceptionOccurred(env);
- if (0 != ex) {
- (*env)->ExceptionClear(env);
- }
二、抛出异常
JNI也允许原生代码抛出异常。由于异常是Java的类,所以在JNI中需要用FindClass函数找到异常类,用ThrowNew函数就可以初始化并抛出新的异常。例如:
- jclass clazz;
- //...
- clazz = (*env)->FindClass(env, "java/lang/NullPointerException");
- if (0 != clazz) {
- (*env)->ThrowNew(env, clazz, "Exception message.");
- }
因为原生方法不受虚拟机的控制,所以抛出的异常并不会停止原生方法的执行。在抛出异常的时候,需要释所有已经分配的资源,例如内存资源...通过JNIEnv接口获得的局部引用,在原生方法返回之后会被虚拟机自动释放。
Android NDK开发篇:Java与原生代码通信(异常处理)的更多相关文章
- Android NDK开发篇(六):Java与原生代码通信(异常处理)
一.捕获异常 异常处理是Java中的功能.在Android中使用SDK进行开发的时候常常要用到.Android原生代码在运行过程中假设遇到错误,须要检測,并抛出异常给Java层.运行原生代码出现了问题 ...
- Android NDK开发篇(四):Java与原生代码通信(原生方法声明与定义与数据类型)
Java与原生代码通信涉及到原生方法声明与定义.数据类型.引用数据类型操作.NIO操作.訪问域.异常处理.原生线程 1.原生方法声明与定义 关于原生方法的声明与定义在上一篇已经讲一点了,这次具体分析一 ...
- Android NDK开发篇:Java与原生代码通信(原生方法声明与定义与数据类型)
Java与原生代码通信涉及到原生方法声明与定义.数据类型.引用数据类型操作.NIO操作.访问域.异常处理.原生线程 1.原生方法声明与定义 关于原生方法的声明与定义在上一篇已经讲一点了,这次详细分析一 ...
- Android NDK开发篇(五):Java与原生代码通信(数据操作)
尽管说使用NDK能够提高Android程序的运行效率,可是调用起来还是略微有点麻烦.NDK能够直接使用Java的原生数据类型,而引用类型,由于Java的引用类型的实如今NDK被屏蔽了,所以在NDK使用 ...
- Android NDK开发篇:Java与原生代码通信(数据操作)
虽然说使用NDK可以提高Android程序的执行效率,但是调用起来还是稍微有点麻烦.NDK可以直接使用Java的原生数据类型,而引用类型,因为Java的引用类型的实现在NDK被屏蔽了,所以在NDK使用 ...
- Android NDK开发(五)--C代码回调Java代码【转】
转载请注明出处:http://blog.csdn.net/allen315410/article/details/41862479 在上篇博客里了解了Java层是怎样传递数据到C层代码,并且熟悉了大部 ...
- Android NDK开发篇:如何使用JNI中的global reference和local reference
JNI提供了一些实例和数组类型(jobject.jclass.jstring.jarray等)作为不透明的引用供本地代码使用.本地代码永远不会直接操作引用指向的VM内部的数据内容.要进行这些操作,必须 ...
- Android NDK 开发(四)java传递数据到C【转】
转载请注明出处:http://blog.csdn.net/allen315410/article/details/41845701 前面几篇文章介绍了Android NDK开发的简单概念.常见错误及处 ...
- Android NDK开发 JNI操作java构造方法,普通方法,静态方法(七)
Android NDK开发 JNI操作java普通.静态.构造方法 1.Jni实例化一个Java类的实例jobject 1.通过FindClas( ),获取Java类的的jclass 2.通过GetM ...
随机推荐
- 【Python小试】判断一条序列GC含量高低
题目: 随便给定一条序列,如果GC含量超过65%,则认为高. 编程: from __future__ import division #整数除法 def is_gc_rich(dna): length ...
- Macbookpro快捷键
Alt键代替 Option 键,用 Windows 标志键代替 Command 键. 但是,使用的时候,Command健类似于Windows的Control键. 1.复制.粘贴.剪切.全选.查找 Co ...
- Genscan指南
Genscan指南 GenScan是一个gene识别软件,主要是通过已知生物的基因结构特征来识别新的基因(parse).所利用的基因特征请参看readme文件. 特点: 只考虑编码蛋白的基因. 模型考 ...
- Python基础之字典内置方法
目录 1. 字典 1.1 字典的作用 1.2 创建和使用字典 1.2.1 dict类 1.2.2 基本的字典操作 1.2.3 字典方法 1. 字典 映射:可以通过名称来访问其各个值的数据结构. 字典是 ...
- mongodb-to-mongodb
python3用于mongodb数据库之间倒数据,特别是分片和非分片之间. 本项目是一个集合一个集合的倒. 参考了logstash,对于只增不减而且不修改的数据的可以一直同步,阻塞同步,断点同步.改进 ...
- Java 读取txt文件生成Word文档
本文将以Java程序代码为例介绍如何读取txt文件中的内容,生成Word文档.在编辑代码前,可参考如下代码环境进行配置: IntelliJ IDEA Free Spire.Doc for Java T ...
- ui自动化测试,页面方法的使用
悬浮下拉框 的设置选择 下拉框的选择 显性等待 双击, ActionChains类的方法行动链 提示框 双击,右击 双击用到行动连,提示框用到Alert的类 右击用到的也是行动连 UI自动化测试 #h ...
- 紧张 + 刺激,源自一次 OOM 历险
作者 | 蚂蝗 背景 Erda 是集 DevOps.微服务治理.多云管理以及快数据管理等多功能的开源一站式企业数字化平台.其中,在 DevOps 模块中,不仅有 CI/CD.项目协同等功能,同时还 ...
- three.js很好玩
能用鼠标拉着转. https://files.cnblogs.com/files/blogs/714801/%E7%A9%BA%E9%97%B4%E5%87%A0%E4%BD%95.7z var po ...
- 【DFS与BFS】洛谷 P1135 奇怪的电梯
题目:奇怪的电梯 - 洛谷 (luogu.com.cn) 因为此题数据范围较小,有dfs及bfs等多种做法. DFS 比较正常的dfs,注意vis数组一定要回溯,不然会漏情况 例如这个数据 11 1 ...