前言:相信大家都遇到过bug,有bug肯定有异常,有异常我们肯定要捕获,ok,今天我们就来看下JNI下的异常捕获!
------------分割线----------
故意在c中写错一些参数让其抛出异常看看java层是否能捕捉到。
java代码:
public static void main(String[] args) {
TestJni tj = new TestJni();
try {
// 使用方法内容故意写错抛出异常
tj.exception();
// 特别注意要使用Throwable才能捕获到异常
} catch (Throwable e) {
System.out.println("Throwable捕获到异常");
e.printStackTrace();
}
try {
// 使用方法内容故意写错抛出异常
tj.exception();
// 特别注意要使用Exception不能捕获到异常
} catch (Exception e) {
System.out.println("Exception捕获到异常");
e.printStackTrace();
}
}
// 内部故意写错抛出异常
public native void exception();
// 加载动态库
static {
System.loadLibrary("JNI");
}
C代码:
#include"com_fly_TestJni.h"
JNIEXPORT void JNICALL Java_com_fly_TestJni_exception
(JNIEnv *env, jobject job){
jclass cls = (*env)->GetObjectClass(env, job);
//其实内部没有haha这个属性变量所以 会发生异常
jfieldID myjfieldID = (*env)->GetFieldID(env, cls, "haha", "()V");
(*env)->GetObjectField(env, job, myjfieldID);
}
运行显示:
可以得出只有Throwable才能捕获异常!
----------分割线--------
手动在c里面抛出去一个异常
java代码不需要改动。
C代码:
#include"com_fly_TestJni.h"
JNIEXPORT void JNICALL Java_com_fly_TestJni_exception
(JNIEnv *env, jobject job){
jclass d = (*env)->FindClass(env, "java/lang/IllegalArgumentException");
(*env)->ThrowNew(env, d, "-->Exceptions from the C<--");
}
运行截图:
Throwable和Exception都可以捕获到异常!
-------完-------