【问题标题】:How to throw an exception from C while using Android NDK?使用 Android NDK 时如何从 C 中抛出异常?
【发布时间】:2019-07-28 11:44:42
【问题描述】:

我的应用程序在 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) 

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

我看到了来自:How to throw an exception in C? 的建议,但不确定它是否适用于 Android(也可移植到 iOS。)。

【问题讨论】:

    标签: android exception android-ndk abort


    【解决方案1】:

    您可以抛出 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 */
    }
    

    【讨论】:

      【解决方案2】:

      您想澄清您的意思是抛出一个 Java 异常,您需要 JNI。特别是 JNI ThrowException function

      您找到的任何有关从 JNI 引发异常的文档都适用于 Android。 (但这些都不适用于 iOS。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-18
        • 2023-03-19
        • 1970-01-01
        • 2013-05-24
        • 2011-02-22
        • 1970-01-01
        • 2012-01-31
        相关资源
        最近更新 更多