JNI抛出异常
发布日期:2022-01-31 02:37:38 浏览次数:40 分类:技术文章

本文共 1007 字,大约阅读时间需要 3 分钟。

简单记录一下

以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.异常的抛出并非即时的,例如在一个耗时的解码流程前抛出异常,发现在完成解码流程,函数返回后程序才崩溃。

转载地址:https://blog.csdn.net/no_367/article/details/103293544 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:FFmpeg与MediaCodec 简单总结
下一篇:linux中查找NDK中需要的.a库文件

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年03月28日 02时10分36秒