Captura de excepción JNI
1. JNI detecta una excepción y la borra
java proporciona un método con excepción
public int getNumBer(){
return 4/0; // 异常行
}
// 定义一个native方法
public native int init();
Limpieza de captura de código JNI
extern "C"
JNIEXPORT jint JNICALL
Java_com_xyx_open_MainActivity_init(JNIEnv *env, jobject thiz) {
jclass mainActivityClz = env->GetObjectClass(thiz);
jmethodID getNumber_C = env->GetMethodID(mainActivityClz, "getNumBer", "()I");
jint result = env->CallIntMethod(thiz, getNumber_C);
LOGE("开始捕捉异常.........");
// 捕捉异常
jthrowable jthrowable1= env->ExceptionOccurred();
// 如果有异常
if (jthrowable1){
LOGE("出现异常了.........");
// 清除异常信息
env->ExceptionClear();
return -1 ;
}
return result;
}
2. JNI detecta la excepción, la borra y la lanza a Java
codigo java:
try {
init2();
}catch (IllegalArgumentException e){
Log.e("zyb", "onCreate: 参数异常...."+e.getMessage() );
}
public native int init2()throws IllegalArgumentException;
public int getNumBer(){
return 4/0;
}
codigo c++
extern "C"
JNIEXPORT jint JNICALL
Java_com_xyx_open_MainActivity_init2(JNIEnv *env, jobject thiz) {
jclass mainActivityClz = env->GetObjectClass(thiz);
jmethodID getNumber_C = env->GetMethodID(mainActivityClz, "getNumBer", "()I");
jint result = env->CallIntMethod(thiz, getNumber_C);
LOGE("开始捕捉异常.........");
// 捕捉异常
jthrowable jthrowable1= env->ExceptionOccurred();
// 如果有异常
if (jthrowable1){
LOGE("出现异常了.........");
// 清除异常信息
env->ExceptionClear();
jclass exception=env->FindClass("java/lang/IllegalArgumentException");
env->ThrowNew(exception,"参数异常.分母为0了.....");
return -1 ;
}
return result;
}
3. JNI captura el método java que lanza una excepción
public native void init3();
public int getNumBer2(int div){
if (div==0) throw new IllegalArgumentException("参数出错误了 ......");
return 4/div;
}
codigo c++
extern "C"
JNIEXPORT void JNICALL
Java_com_xyx_open_MainActivity_init3(JNIEnv *env, jobject thiz) {
jclass mainActivityClz = env->GetObjectClass(thiz);
jmethodID getNumber_C = env->GetMethodID(mainActivityClz, "getNumBer2", "(I)I");
jint result = env->CallIntMethod(thiz, getNumber_C,0);
LOGE("开始捕捉异常.........");
// 捕捉异常
jboolean jthrowable1= env->ExceptionCheck();
// 如果有异常
if (jthrowable1){
LOGE("出现异常了.........");
// 清除异常信息
env->ExceptionClear();
}
LOGE("程序继续运行.........");
}