美文网首页
Android NDK(三)- JNI 异常

Android NDK(三)- JNI 异常

作者: teletian | 来源:发表于2022-06-24 21:31 被阅读0次

常用方法

/*
 * 抛出一个 java.lang.Throwable 对象。
 *
 * @return 成功返回 0,否则返回负数。
 */
jint Throw(JNIEnv *env, jthrowable obj);
/*
 * 使用指定的消息从指定的类构造一个异常对象,并抛出该异常。
 *
 * @param clazz:java.lang.Throwable 的子类 
 * @param message:用于构造 java.lang.Throwable 对象的消息。
 * @return 成功返回 0,否则返回负数。
 */
jint ThrowNew(JNIEnv *env, jclass clazz, const char *message);
/*
 * 确定是否引发异常。在本地代码调用 ExceptionClear() 或 Java 代码处理该异常之前,该异常将一直被抛出。
 *
 * @return 返回当前正在抛出的异常对象,如果当前没有抛出异常则返回 NULL。
 */
jthrowable ExceptionOccurred(JNIEnv *env);
/*
 * 将异常和堆栈的回溯打印到系统错误报告通道,例如 stderr。这是为调试提供的便利例程。
 */
void ExceptionDescribe(JNIEnv *env);
/*
 * 清除当前引发的任何异常。
 */
void ExceptionClear(JNIEnv *env);
/*
 * 引发致命错误,并且不希望 VM 恢复。
 */
void FatalError(JNIEnv *env, const char *msg);
/*
 * 检查正在抛出的异常,而无需创建对异常对象的本地引用。
 *
 * @return 有正在抛出的异常时返回 JNI_TRUE;否则返回 JNI_FALSE。
 */
jboolean ExceptionCheck(JNIEnv *env);

使用例 1 - C++ 中抛出异常

jclass clazz = env->FindClass("java/lang/UnsupportedOperationException");
if (clazz != nullptr) {
    env->ThrowNew(clazz, "Sorry, device is unsupported.");
}
env->DeleteLocalRef(clazz);

使用例 2 - C++ 捕获 Java 中的异常

public void func() {
    throw new IllegalArgumentException("test");
}

public native void testException();
extern "C" JNIEXPORT void JNICALL
Java_com_sample_MainActivity_testException(JNIEnv *env, jobject thiz) {
    jclass clazz = env->FindClass("com/sample/MainActivity");
    if (clazz != nullptr) {
        jmethodID func = env->GetMethodID(clazz, "func", "()V");
        env->CallVoidMethod(thiz, func);
        if (func != nullptr) {
            if (env->ExceptionCheck()) {
                env->ExceptionDescribe();
                env->ExceptionClear();
            }
        }
    }
    env->DeleteLocalRef(clazz);
}

相关文章

网友评论

      本文标题:Android NDK(三)- JNI 异常

      本文链接:https://www.haomeiwen.com/subject/ktmkvrtx.html