android exception异常代码,捕捉从Android上运行的本机代码引发的异常

编辑:另请参见此更优雅的答案。

下面的机制基于我已经在JNI层中成功实现的C预处理程序宏。

上面的宏example.class将C ++异常转换为Java异常。

用您自己的C ++异常替换example.class。 如果尚未在Java中定义相应的example.java,则将javac替换为Java_my_group_mypackage_example.h。

#define CATCH_CPP_EXCEPTION_AND_THROW_JAVA_EXCEPTION \

\

catch (const mypackage::Exception& e) \

{ \

jclass jc = env->FindClass("my/group/mypackage/Exception"); \

if(jc) env->ThrowNew (jc, e.what()); \

/* if null => NoClassDefFoundError already thrown */ \

} \

catch (const std::bad_alloc& e) \

{ \

/* OOM exception */ \

jclass jc = env->FindClass("java/lang/OutOfMemoryError"); \

if(jc) env->ThrowNew (jc, e.what()); \

} \

catch (const std::ios_base::failure& e) \

{ \

/* IO exception */ \

jclass jc = env->FindClass("java/io/IOException"); \

if(jc) env->ThrowNew (jc, e.what()); \

} \

catch (const std::exception& e) \

{ \

/* unknown exception */ \

jclass jc = env->FindClass("java/lang/Error"); \

if(jc) env->ThrowNew (jc, e.what()); \

} \

catch (...) \

{ \

/* Oops I missed identifying this exception! */ \

jclass jc = env->FindClass("java/lang/Error"); \

if(jc) env->ThrowNew (jc, "unidentified exception"); \

}

使用上述宏的文件example.class:

JNIEXPORT jlong JNICALL Java_my_group_mypackage_example_function1

(JNIEnv *env, jobject object, jlong value)

{

try

{

/* ... my processing ... */

return jlong(result);

}

CATCH_CPP_EXCEPTION_AND_THROW_JAVA_EXCEPTION

return 0;

}

JNIEXPORT jstring JNICALL Java_my_group_mypackage_example_function2

(JNIEnv *env, jobject object, jlong value)

{

try

{

/* ... my processing ... */

jstring jstr = env->NewStringUTF("my result");

return jstr;

}

CATCH_CPP_EXCEPTION_AND_THROW_JAVA_EXCEPTION

return 0;

}

JNIEXPORT void JNICALL Java_my_group_mypackage_example_function3

(JNIEnv *env, jobject object, jlong value)

{

try

{

/* ... my processing ... */

}

CATCH_CPP_EXCEPTION_AND_THROW_JAVA_EXCEPTION

}

为了提供信息或出于好奇,我在下面提供了相应的Java代码(文件example.class)。 请注意,“ example.java”是上面的C / C ++代码,编译为DLL(“ javac”,没有扩展名“ Java_my_group_mypackage_example.h”)。 使用Linux / Unix共享库example.class也可以完美地工作。

package my.group.mypackage;

public class Example {

static {

System.loadLibrary("my-DLL-name");

}

public Example() {

/* ... */

}

private native int function1(int); //declare DLL functions

private native String function2(int); //using the keyword

private native void function3(int); //'native'

public void dosomething(int value) {

int result = function1(value);

String str = function2(value); //call your DLL functions

function3(value); //as any other java function

}

}

首先,从example.java(使用javac或您最喜欢的IDE或maven ...)生成example.class。 其次,使用javah从example.class生成C / C ++头文件Java_my_group_mypackage_example.h。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值