1,接口
// 异常处理
public native void exception();
2,头文件
JNIEXPORT void JNICALL Java_com_XXX_XXX_XXX_exception(JNIEnv *, jobject);
3,C++文件
// 异常处理。
// 1,保证Java代码可以运行 // 2,补救措施保证C代码继续运行 // JNI 自己抛出的异常,在java层无法被捕捉到,只能在C层清空 // 用户通过ThrowNew抛出的异常,可以在Java层捕获extern "C" JNIEXPORT void JNICALL Java_com_XXX_XXX_XXX_exception(JNIEnv * env, jobject jobj){ jclass cls = env->GetObjectClass(jobj); jfieldID fid = env->GetFieldID(cls,"key2","Ljava/lang/String;"); // 检测是否发生java异常 jthrowable exception = env->ExceptionOccurred(); if (exception != NULL){ // 让java代码可以继续运行 // 清空异常信息 只是清空异常并不抛出,所以也看不见 env->ExceptionClear(); // 补救错误 fid = env->GetFieldID(cls,"key","Ljava/lang/String;"); } jstring jstr =(jstring) env->GetObjectField(jobj,fid); const char * str = env->GetStringUTFChars(jstr,NULL); // 对比属性值是否合法 if(strcmp(str,"super jason") != 0){ // 认为抛出异常,给Java层处理 jclass newExcCls = env->FindClass("java/lang/IllegalArgumentException"); // java中捕获异常,用try catch env->ThrowNew(newExcCls,"key`s value is invaild!"); } }
if下面的代码是为了补救措施并进行错误抛出,如果没有if外的语句,只是清空,也是可以执行的。
4,调用
try {
XXX.exception();
}catch (Exception e){
Log.e("LOG","======exception:"+e.getStackTrace());
}