JNI和异常的那点事
作为一个技术控,即使做项目管理,还是抽空研究技术,先前我写了很多JNI方面的文章,但是很少讲到异常。
下面我就来说说JNI如何抛出异常。
java异常的基本知识就不想说了,大家可以去查下。
先上代码吧,
1,首先我定义了一个exception,
public class JNIExcetption extends Exception {
public JNIExcetption(String msg) {
super(msg);
}
@Override
public String getMessage() {
// TODO Auto-generated method stub
return super.getMessage();
}
}
2,其次我们声明了一个本地方法,public native void exceptionTest(int i) throws JNIExcetption;
3,我调用了这个本地方法。
2,其次我们声明了一个本地方法,public native void exceptionTest(int i) throws JNIExcetption;
3,我调用了这个本地方法。
try {
exceptionTest(2);
} catch (JNIExcetption e) {
// TODO Auto-generated catch block
Log.e("HelloJni java", e.getMessage());
}
try {
exceptionTest(200);
} catch (JNIExcetption e) {
// TODO Auto-generated catch block
Log.e("HelloJni java", e.getClass().getName() + e.getMessage());
}
4,为什么我会调用2次呢,看了我的C++大家就明白了
4,为什么我会调用2次呢,看了我的C++大家就明白了
void exceptionTest(JNIEnv* env, jobject thiz, jint i) {
if (i > 3) {
jclass jclazz = (env)->FindClass("com/example/hellojni/JNIExcetption");
jmethodID methodID = (env)->GetMethodID(jclazz, "<init>", "(Ljava/lang/String;)V");
char buffer[256] =
{ 0 };
sprintf(buffer, "exception info from c++! parameter i is : %d", i);
jstring str = (env)->NewStringUTF(buffer);
jthrowable thr = (jthrowable)(env)->NewObject(jclazz, methodID, str);
(env)->Throw(thr);
}
}
这里我们判断参数是否大于3,当然了通常我们会抛出系统的定义的IllegalArgumentException 异常,其实都是一样的。
这里我比较偷懒,localreference没有delete掉。真正写代码的 时候我们需要delete这些引用,防止过多,前面我也有分析,大家可以看下;
上了一个部分,打印内容
这里我比较偷懒,localreference没有delete掉。真正写代码的 时候我们需要delete这些引用,防止过多,前面我也有分析,大家可以看下;
上了一个部分,打印内容
06-20 04:51:44.653: E/HelloJni java(433): com.example.hellojni.JNIExcetptionexception info from c++! parameter i is : 200
我们看到只有参数大于3才会被打印出来
我们看到只有参数大于3才会被打印出来

浙公网安备 33010602011771号