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与原生代码通信(数据操作)
虽然说使用NDK可以提高Android程序的执行效率,但是调用起来还是稍微有点麻烦.NDK可以直接使用Java的原生数据类型,而引用类型,因为Java的引用类型的实现在NDK被屏蔽了,所以在NDK使用 ...
- Android NDK开发篇(四):Java与原生代码通信(原生方法声明与定义与数据类型)
Java与原生代码通信涉及到原生方法声明与定义.数据类型.引用数据类型操作.NIO操作.訪问域.异常处理.原生线程 1.原生方法声明与定义 关于原生方法的声明与定义在上一篇已经讲一点了,这次具体分析一 ...
- Android NDK开发 JNI操作java构造方法,普通方法,静态方法(七)
Android NDK开发 JNI操作java普通.静态.构造方法 1.Jni实例化一个Java类的实例jobject 1.通过FindClas( ),获取Java类的的jclass 2.通过GetM ...
- Android NDK开发篇(五):Java与原生代码通信(数据操作)
尽管说使用NDK能够提高Android程序的运行效率,可是调用起来还是略微有点麻烦.NDK能够直接使用Java的原生数据类型,而引用类型,由于Java的引用类型的实如今NDK被屏蔽了,所以在NDK使用 ...
- Android NDK开发三:java和C\C++交互
转自:http://www.cnblogs.com/shangdahao/archive/2013/05/02/3053971.html 1.定义native方法并加载动态链接库: public cl ...
- 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开发的简单概念.常见错误及处 ...
随机推荐
- GoJS 、 GoDiagram
http://gojs.net/latest/intro/makingSVG.html http://www.nwoods.com/ http://gojs.net/latest/intro/shap ...
- 声卡由于其配置信息(注册表中的)不完整或已损坏,Windows 无法启动这个硬件设备。(代码 19),
https://zhidao.baidu.com/question/531423560.html 开始 菜单运行 regedit 找到 HKEY_LOCAL_MACHINE\SYSTEM\Curr ...
- 【Devops】【docker】【CI/CD】docker启动的Jenkins容器 - 系统管理 - 全局工具配置 - 自动安装JDK、Maven、Git、Docker
本篇适用于jenkins是启动的docker容器,自动安装JDK Maven Git Docker等全局工具 ========================================= ...
- 【ELK】【docker】【elasticsearch】2.使用elasticSearch+kibana+logstash+ik分词器+pinyin分词器+繁简体转化分词器 6.5.4 启动 ELK+logstash概念描述
官网地址:https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html#docker-cli-run-prod ...
- Ubuntu64位下使用eclipse闪退的解决
解决办法: 删除文件 [workspace]/.metadata/.plugins/org.eclipse.e4.workbench/workbench.xmi
- Select、Poll与Epoll比較
(1)select select最早于1983年出如今4.2BSD中,它通过一个select()系统调用来监视多个文件描写叙述符的数组.当select()返回后,该数组中就绪的文件描写叙述符便会被内核 ...
- 手机端可以和PC端同时在线-java QRCode 实现网站扫码登录(即支持同帐号多设备同时登录)
微信扫码测试地址:: http://sms.reyo.cn 用户名:aa 密码:123456 扫码登录实现方式很多,比如ajax轮询,http长连接(comet...),websocket,event ...
- 解决javamail ssl 测试unable to find valid certification path to requested target
运行 java InstallCert smtp.interdrp.com:465 得到jssecacerts文件后复制到jdk1.6.0_14\jre\lib\security目录 然后再发送邮件就 ...
- 浴血黑帮第三季/全集Peaky Blinders迅雷下载
英文译名 Peaky Blinders (第2季) (2014-8月回归)BBC.本季看点:<浴血黑帮>由<东方的承诺>.<奇异的恩典>编剧斯蒂文·奈特打造,讲述了 ...
- Eclipse 离线汉化的方法
本文感谢:http://jingyan.baidu.com/article/e75057f28401a8ebc91a899e.html 首先进入网址:http://www.eclipse.org/ba ...