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开发的简单概念.常见错误及处 ...
随机推荐
- [EF Core]数据迁移(二)
摘要 在实际项目中,大多都需要对业务逻辑以及操作数据库的逻辑进行分成操作,这个时候该如何进行数据的迁移呢? 步骤 上篇文章:EF Core数据迁移操作 比如,我们将数据上下文放在了Data层. 看一下 ...
- Icon cache rebuilding with Delphi(Delphi 清除Windows 图标缓存源代码)
清除Windows图标缓存的代码: procedure RebuildIconCache; .... const sr_WindowMetrics='Control Panel\Desktop\Win ...
- C# Datatable排序(转)
C# Datatable排序 在C#中要对Datatable排序,可使用DefaultView的Sort方法.先获取Datatable的DefaultView,然后设置得到的Dataview的sort ...
- ANDROID DisplayManager 服务解析一
from://http://blog.csdn.net/goohong/article/details/8536102 http://www.tuicool.com/articles/FJVFnu A ...
- WordPress主题开发:style.css主题信息标记
在最简单的情况下,一个WordPress主题由两个文件构成: index.php ------------------主模版 style.css -------------------主样式表 而且s ...
- tsung执行时报Can't locate Template.pm的解决
[root@openfire-x86v-app01 20141118-0931]# tsung_stats creating subdirectory data creating subdirecto ...
- 浴血黑帮第三季/全集Peaky Blinders迅雷下载
英文译名 Peaky Blinders (第2季) (2014-8月回归)BBC.本季看点:<浴血黑帮>由<东方的承诺>.<奇异的恩典>编剧斯蒂文·奈特打造,讲述了 ...
- IDEA远程debug的使用
1.打开配置页面 2.添加远程调试配置 3.进行参数配置 不同的jdk版本,配置的参数是不一样的! 其中Host为远程服务器的地址,Port为远程debug的端口,注意要与前面设置的address保持 ...
- Qt实现自定义按钮的三态效果
好久之前做的一个小软件,好长时间没动过了,在不记录下有些细节可能都忘了,这里整理下部分功能的实现. 按钮的三态,指的是普通态.鼠标的停留态.点击态,三态是界面交互非常基本的一项功能,Qt中如果使用的是 ...
- 远程连接Oracle数据库
ylbtech-Oracle:远程连接Oracle数据库 所谓远程连接Oracle数据库,是指Oracle数据库服务器和Oracle客户端分别安装在2台电脑上,我们使用Oracle客户端来连接在另一 ...