Android NDK- JNI 异常

Posted teletian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android NDK- JNI 异常相关的知识,希望对你有一定的参考价值。

常用方法

/*
 * 抛出一个 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 异常的主要内容,如果未能解决你的问题,请参考以下文章

Android NDK- JNI 异常

android ndk调试C++ 代码怎么打印异常信息?

Android jni Crash堆栈信息分析

Android开发之《异常处理》

JNI/NDK开发指南——JNI异常处理

JNI/NDK开发指南——JNI异常处理