• 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接口获得的局部引用,在原生方法返回之后会被虚拟机自己主动释放。

  • 相关阅读:
    Linux C 使用 libmaxminddb 读取 GeoIP2 MMDB 获取 IP 的地理位置
    同时装了 Python 3 和 Python 2,怎么用 pip ?
    Linux C Socket 编程
    Shell 筛选符合条件的 ELF 文件
    Linux C 获取本机所有网卡的 IP,Mask
    【转载】VirtualBox 扩展增强包安装
    Linux 下 GCC 的使用
    Linux 基础
    MobaXterm 连接 VirtualBox 6 虚拟机中的 CentOS 7
    ruby使用ocra打包exe文件,,报错libssp-0.dll
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7355995.html
Copyright © 2020-2023  润新知