一、捕获异常

异常处理是Java中的功能。在Android中使用SDK进行开发的时候常常要用到。Android原生代码在运行过程中假设遇到错误,须要检測,并抛出异常给Java层。运行原生代码出现了问题,比如使用了空指针、内存泄漏。而且没有做对应的检測盒异常抛出。APP会立即闪退。没有不论什么提示。

JNI中的异常处理和Java的不一样。Java中的异常处理,是直接捕获,然后做对应的处理。

JNI要求开发者在异常发生之后显式实现异常处理流。比例如以下面样例:

  1. public class JavaClass {
  2. /**
  3. * 异常抛出方法
  4. */
  5. private void throwException() throws NullPointerException {
  6. throw new NullPointerException("Null pointer");
  7. }
  8.  
  9. /**
  10. * 原生方法
  11. */
  12. private native void nativeMethod();
  13. }

在原生方法nativeMethod中调用throwException方法。nativeMethod原生方法须要显示地做异常处理。JNI提供了ExceptionOccurred函数查询虚拟机是否有挂起的异常。

在使用完之后。还须要ExceptionClear函数显式地清除异常。

  1. jthrowable ex;
  2.  
  3. //...
  4.  
  5. (*env)->CallVoidMethod(env, instance, throwExceptionId);
  6. ex = (*env)->ExceptionOccurred(env);
  7. if (0 != ex) {
  8. (*env)->ExceptionClear(env);
  9. }

二、抛出异常

JNI也同意原生代码抛出异常。因为异常是Java的类,所以在JNI中须要用FindClass函数找到异常类。用ThrowNew函数就能够初始化并抛出新的异常。比如:

  1. jclass clazz;
  2.  
  3. //...
  4.  
  5. clazz = (*env)->FindClass(env, "java/lang/NullPointerException");
  6. if (0 != clazz) {
  7. (*env)->ThrowNew(env, clazz, "Exception message.");
  8. }

由于原生方法不受虚拟机的控制,所以抛出的异常并不会停止原生方法的运行。在抛出异常的时候。须要释全部已经分配的资源,比如内存资源...通过JNIEnv接口获得的局部引用,在原生方法返回之后会被虚拟机自己主动释放。

Android NDK开发篇(六):Java与原生代码通信(异常处理)的更多相关文章

  1. Android NDK开发篇:Java与原生代码通信(异常处理)

    一.捕获异常 异常处理是Java中的功能,在Android中使用SDK进行开发的时候经常要用到.Android原生代码在执行过程中如果遇到错误,需要检测,并抛出异常给Java层.执行原生代码出现了问题 ...

  2. Android NDK开发篇:Java与原生代码通信(原生方法声明与定义与数据类型)

    Java与原生代码通信涉及到原生方法声明与定义.数据类型.引用数据类型操作.NIO操作.访问域.异常处理.原生线程 1.原生方法声明与定义 关于原生方法的声明与定义在上一篇已经讲一点了,这次详细分析一 ...

  3. Android NDK开发篇:Java与原生代码通信(数据操作)

    虽然说使用NDK可以提高Android程序的执行效率,但是调用起来还是稍微有点麻烦.NDK可以直接使用Java的原生数据类型,而引用类型,因为Java的引用类型的实现在NDK被屏蔽了,所以在NDK使用 ...

  4. Android NDK开发篇(四):Java与原生代码通信(原生方法声明与定义与数据类型)

    Java与原生代码通信涉及到原生方法声明与定义.数据类型.引用数据类型操作.NIO操作.訪问域.异常处理.原生线程 1.原生方法声明与定义 关于原生方法的声明与定义在上一篇已经讲一点了,这次具体分析一 ...

  5. Android NDK开发 JNI操作java构造方法,普通方法,静态方法(七)

    Android NDK开发 JNI操作java普通.静态.构造方法 1.Jni实例化一个Java类的实例jobject 1.通过FindClas( ),获取Java类的的jclass 2.通过GetM ...

  6. Android NDK开发篇(五):Java与原生代码通信(数据操作)

    尽管说使用NDK能够提高Android程序的运行效率,可是调用起来还是略微有点麻烦.NDK能够直接使用Java的原生数据类型,而引用类型,由于Java的引用类型的实如今NDK被屏蔽了,所以在NDK使用 ...

  7. Android NDK开发三:java和C\C++交互

    转自:http://www.cnblogs.com/shangdahao/archive/2013/05/02/3053971.html 1.定义native方法并加载动态链接库: public cl ...

  8. Android NDK开发篇:如何使用JNI中的global reference和local reference

    JNI提供了一些实例和数组类型(jobject.jclass.jstring.jarray等)作为不透明的引用供本地代码使用.本地代码永远不会直接操作引用指向的VM内部的数据内容.要进行这些操作,必须 ...

  9. Android NDK 开发(四)java传递数据到C【转】

    转载请注明出处:http://blog.csdn.net/allen315410/article/details/41845701 前面几篇文章介绍了Android NDK开发的简单概念.常见错误及处 ...

随机推荐

  1. [Winform]检测exe是否已经运行,并将其置顶

    摘要 在很多pc应用中,基本上都需要有这样的判断,保证在一个终端只运行一个winform的client.并且如果最小化了,用户再次双击桌面图标的时候,将client置顶显示. 解决方案 需要使用win ...

  2. AngularJS路由系列(4)-- UI-Router的$state服务、路由事件、获取路由参数

    本系列探寻AngularJS的路由机制,在WebStorm下开发.主要包括: ● UI-Router的$state服务● UI-Router的路由事件● UI-Router获取路由参数 Angular ...

  3. C#把数组中的某个元素取出来放到第一个位置

    如何取出数组中符合某种条件的元素,然后放在数组最前面,即索引为0的位置? 思路大致如下:→找到符合条件的数组元素,把之赋值给一个临时变量temp,并记下该数组元素的索引位置,假设是index→在源数组 ...

  4. CentOS MongoDB 高可用实战

    原文:https://www.sunjianhua.cn/archives/centos-mongodb.html 一.MongoDB 单节点 1.1.Windows 版安装 1.1.1 获取社区版本 ...

  5. 【python】安装Python 的IDE--PyCharm

    [百度网盘-技术-pycharm破解需要的有安装包和破解jar] ================================================== 安装Tensorflow开发环境 ...

  6. python测试开发django-17.admin后台管理

    前言 通常一个网站开发,需要有个后台管理功能,比如用后台管理发布文章,添加用户之类的操作.django的admin后台管理主要可以实现以下功能 基于admin模块,可以实现类似数据库客户端的功能,对数 ...

  7. jquery 带农历天干地支的日期选择控件

    效果图:

  8. Java泛型的一些限制

    本文主要參考<Java编程思想(第4版)>的Java泛型章节,仅当一个简单的读书笔记. 和C++泛型对照,Java泛型仅仅是一种编译期间的擦拭机制. 这是因为考虑到和曾经的兼容而考虑的一种 ...

  9. Jenkins 快速搭建

    Jenkins 介绍 Jenkins 作为持续集成的重要工具,在DevOps整个工具链中有重要的地位.Jenkins 一般作为独立的应用运行在Java Servlet容器中如Jetty,也可以运行在其 ...

  10. modbus.c

    #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> //#include ...