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