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,我调用了这个本地方法。
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++大家就明白了
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这些引用,防止过多,前面我也有分析,大家可以看下;

上了一个部分,打印内容
06-20 04:51:44.653: E/HelloJni java(433): com.example.hellojni.JNIExcetptionexception info from c++! parameter i is : 200
我们看到只有参数大于3才会被打印出来
posted @ 2013-07-29 17:32  samxu  阅读(1878)  评论(0)    收藏  举报