zoukankan      html  css  js  c++  java
  • Android JNI开发摘录(四)之JNI异常处理

         五.处理本机代码中的异常

         为了处理以Java代码实现的方法执行中抛出的异常,或者是以本机代码编写的方法抛出的Java异常,JNI提供了Java异常机制的钩子程序。该机制与C/C++中常规函数实现的标准错误处理无关。JNI提供一个函数集来在本机代码中检查、分析和处理Java异常。

        (1).如果一个异常已经抛出,下面的函数返回JNI_TRUE,否则返回JNI_FALSE:

    jboolean ExceptionCheck();

    /*如:当异常发生时,清理并抛出自定义异常*/
    if(env->ExceptionCheck())
    {
    env->ExceptionClear();//清除异常
    env->ThrowNew(env->FindClass("java/lang/Exception"),"xx异常");
    }

        (2).ExceptionOccurred函数获取正在被抛出异常的一个本地引用。本机代码或者Java代码必须处理该异常:

    jthrowable ExceptionOccurred();

        (3).ExceptionDescribe函数打印有关刚刚被抛出到标准错误输出中的异常信息。该信息包括一个栈追踪信息:

    void ExceptionDescribe();

        (4).ExceptionClear函数清理一个刚刚抛出的异常:

    void ExceptionClear();

        (5).Throw 函数抛出一个已经创建的异常。如果异常成功抛出,返回0;否则返回一个负值:

    jint Throw(jthrowable obj);

    /*可以这样使用:手动抛出异常,然后在本机或Java代码中处理*/
    jthrowable mException = NULL;
    mException = env->ExceptionOccurred();
    if (mException != NULL) {
    env->Throw(mException);
    /*或抛出自定义异常
    env->ThrowNew(env->FindClass("java/lang/Exception"),
    "xxx异常");
    */
    //最后别忘了清除异常,不然还是会导致VM崩溃
    env->ExceptionClear();
    return -1;
    }



        (6).ThrowNew函数基于clazz创建一个异常,它应该是继承自Throwable,并且异常文本是由msg(按照UTF-8)指定。如果异常的构造以及抛出成功,返回0;否则返回一个负值。

    jint ThrowNew(jclass clazz,const char *msg);

    /*如:在可能出错的地方抛出自定义异常,然后在本机代码或者Java代码中处理*/
    env->ThrowNew(env->FindClass("java/lang/Exception"),
    "xxx异常");



         (7)FatalError函数会生成致命错误信号。一个致命错误是特指无法恢复的情况。VM在调用该函数之后将会关闭:

    void FatalError(const char *msg);



  • 相关阅读:
    MongoDB 启动和关闭
    java protostuff 序列化反序列化工具
    第一天
    第六章
    第六章
    第六章
    第六章
    第五章---面向对象---1.软件开发/2.异常处理/3.try...except的详细用法
    第五章-面向对象-1.元类介绍/2.自定义元类控制类的行为/3.控制类的实例化行为/4.控制类的实例化行为的应用
    第五章---面向对象---1.绑定方法与非绑定方法介绍/2.绑定方法与非绑定方法应用/3.反射/4.内置方法
  • 原文地址:https://www.cnblogs.com/oxgen/p/2381024.html
Copyright © 2011-2022 走看看