JNI抛出异常

简单记录一下

以RuntimeException为例。这是C++的代码,如果使用C的代码的话JNIEnv的使用方式应该为(*env)->FindClass(env, “java/lang/RuntimeException”);
注意是用的"->",同时参数中要加上JNIEnv的结构体指针

void runtime_exception_throw(JNIEnv *env, const char * m) {
    if(!env) return;
    jclass exception_class = (*env).FindClass("java/lang/RuntimeException");
    if(exception_class) {
        (*env).ThrowNew(exception_class, (char *)m);
    }
    (*env).DeleteLocalRef(exception_class);
}

如果想要在抛出异常时进行字符串格式化,可以在调用函数之前先用sprintf格式化一下,或者弄个宏:

#define RUNTIME_EXCETION_THROW(e, format, ...) do { \
    char buffer[256]; \
    sprintf(buffer, format, ##__VA_ARGS__); \
    runtime_exception_throw(e, buffer); \
} while (0)

buffer为256字节,对正常的异常抛出应该是没有问题的,实际上可以减小
使用时直接用RUNTIME_EXCEPTION_THROW来输出即可,如:

RUNTIME_EXCEPTION_THROW(env, "Error code : #%d. Error message : %s", errCode, message);

也可以选择将异常的类名称作为参数进行传入,这样的话,可以更为灵活地使用。
再说几点发现吧:
1.在JNI中抛出异常并不会立刻终止native代码的运行,如果在抛出异常后立即使用(*env).ExceptionClear()清除异常的话,JAVA层也不会收到异常。
2.异常的抛出并非即时的,例如在一个耗时的解码流程前抛出异常,发现在完成解码流程,函数返回后程序才崩溃。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值