使用Android NDK时如何从C引发异常?

时间:2019-03-06 17:54:00

标签: android exception android-ndk abort

我的应用程序在C ++ / C NDK层深处随机崩溃。回溯对Google Play控制台没有帮助。

这是回溯:

#00 pc 000000000004bba8 /system/lib/libc.so (tgkill+12) 
#01 pc 000000000001aa13 /system/lib/libc.so (abort+54) 
#02 pc 000000000001f2f9 /system/lib/libc.so (__libc_fatal+24) 
#03 pc 000000000001aedd /system/lib/libc.so (__assert2+16) 

我正在考虑在我的断言包装中将assert更改为引发异常。

我从How to throw an exception in C?看了一些建议,但不确定它是否适用于Android(也适用于iOS)。

2 个答案:

答案 0 :(得分:0)

您想弄清楚您的意思是抛出Java异常,而您想要Java异常。特别是JNI ThrowException function

您发现有关从JNI引发异常的任何文档都将适用于Android。 (但是这些都无法在iOS上使用。)

答案 1 :(得分:0)

您可以引发Java异常,例如IllegalArgumentException,来自JNI层,如下所示:

//JNIEnv *env,

jclass jcls = env->FindClass("java/lang/IllegalArgumentException");
env->ThrowNew(jcls, "Argument cannot be null.");

此外,您可以在JNI层中检查异常状态,如下所示:

//JNIEnv *env,

jboolean flag = env->ExceptionCheck();
if (flag) {
    env->ExceptionClear();
    /* code to handle exception */
}