java JNI编程指南

内容发布更新时间 : 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

>>展开全文<<
12@gma联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4 ceshi