内容发布更新时间 : 2025/5/21 19:07:01星期一 下面是文章的全部内容请认真阅读。
20. FID_Window_handle =
21. (*env)->GetFieldID(env, classWindow, \22. if (FID_Window_handle == NULL) { /* important check. */ 23. return; /* error occurred. */ 24. }
25. FID_Window_length =
26. (*env)->GetFieldID(env, classWindow, \27. if (FID_Window_length == NULL) { /* important check. */ 28. return; /* error occurred. */ 29. }
30. FID_Window_width =
31. (*env)->GetFieldID(env, classWindow, \32. /* no checks necessary; we are about to return anyway */ 33. } 第二种方式:
public class Fraction {
// details such as constructors omitted int over, under; public int floor() {
return Math.floor((double)over/under); } }
/* Native code that calls Fraction.floor. Assume method ID MID_Fraction_floor has been initialized elsewhere. */ void f(JNIEnv *env, jobject fraction) {
jint floor = (*env)->CallIntMethod(env, fraction,
MID_Fraction_floor); /* important: check if an exception was raised */ if ((*env)->ExceptionCheck(env)) { return; }
... /* use floor */ }
当一个JNI函数返回一个明确的错误码时,你仍然可以用ExceptionCheck来检查是否有异常发生。但是,用返回的错误码来判断比较高效。一旦JNI函数的返回值是一个错误码,那么接下来调用ExceptionCheck肯定会返回JNI_TRUE。
6.2.2 异常处理
本地代码通常有两种方式来处理一个异常:
1、 一旦发生异常,立即返回,让调用者处理这个异常。
2、 通过ExceptionClear清除异常,然后执行自己的异常处理代
码。
当一个异常发生后,必须先检查、处理、清除异常后再做其它JNI函数调用,否则的话,结果未知。当前线程中有异常的时候,你可以调用的JNI函数非常少,11.8.2节列出了这些JNI函数的详细列表。通常来说,当有一个未处理的异常时,你只可以调用两种JNI函数:异常处理函数和清除VM资源的函数。 当异常发生时,释放资源是一件很重要的事,下面的例子中,调用GetStringChars函数后,如果后面的代码发生异常,不要忘了调用Releas