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);



  • 相关阅读:
    逻辑即理性
    关于股市与经济的一点思考
    Objective-C Automatic Reference Counting (ARC)
    错误与异常
    Programming with Objective-C -- 属性的缺省实现
    视频容器格式与编码格式简介
    视频基础知识-封装格式和编码格式
    各种音视频编解码学习详解
    你的技术护城河是什么?--技术前沿代表了一个人的眼力和价值
    技术前沿--很多技术不了解细节也应该了解大概---知道能用来干什么--了解技术的价值
  • 原文地址:https://www.cnblogs.com/oxgen/p/2381024.html
Copyright © 2011-2022 走看看