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



  • 相关阅读:
    PHP使用file_put_contents写入文件的优点
    CSS3如何去除 inline block 元素之间多出的空格
    PHP中根据IP地址判断所在城市等信息
    CSS3使用Animation为同一个元素添加多个动画效果
    Ubuntu Server 12.04 安装 Jabberd2 服务器
    Mac系统使用命令行快捷打开Sublime
    在 Flash ActionScript 2.0 中调用 Javascript 方法
    elem.attr()无法正确判断checkbox是否选中
    android 竖向viewpager
    【iOS入门】UITableView
  • 原文地址:https://www.cnblogs.com/oxgen/p/2381024.html
Copyright © 2011-2022 走看看