少年意气强不羁,虎胁插翼白日飞。这篇文章主要讲述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." ); }
【Android NDK开发篇(Java与原生代码通信(异常处理))】 由于原生方法不受虚拟机的控制,所以抛出的异常并不会停止原生方法的运行。在抛出异常的时候。须要释全部已经分配的资源,比如内存资源...通过JNIEnv接口获得的局部引用,在原生方法返回之后会被虚拟机自己主动释放。
推荐阅读
- android开发——从相冊中选择图片不裁剪
- Spring MVC(handlermapping)
- android http通信之HttpURLConnection post乱码问题
- win10 大文件安卓android studio修改 汉化
- [Android] 开发第十一天
- firemonkeyListViewDynamicAppearance
- RobotFramework自动化测试框架-移动手机自动化测试AppiumLibrary介绍
- 安卓android杀不死进程,保护,双进程守护,驻留,Marsdaemon,保活
- Android开发(SharedPreferences 存储数据获取数据)