The JNI spec. seems to be inaccuratate and is leading to some confusion in the field.
JNI spec.....
http://java.sun.com/j2se/1.3/docs/guide/jni/spec/design.doc.html#770
"Exception Handling
There are two ways to handle an exception in native code:
* The native method can choose to return immediately, causing the exception to be thrown in the Java code that initiated the native method call.
* The native code can clear the exception by calling ExceptionClear(), and then execute its own exception-handling code.
After an exception has been raised, the native code must first clear the exception before making other JNI calls. When there is a pending exception, the only JNI functions that are safe to call are ExceptionOccurred(), ExceptionDescribe(), and ExceptionClear(). The ExceptionDescribe() function prints a debugging message about the pending exception."
There has been discussions about this matter, and depends on the VM implementation, but we
should follow the JNI spec.
*** (#3 of 5): 2005-12-14 15:26:07 PST ###@###.###
Please see http://java.sun.com/docs/books/jni/html/design.html#2193. The spec quoted in the previous evaluation comment is incorrect and should be fixed. The attached files Test7.java and Test7.c illustrate why. For example, in Test7.c
for (i = 0; i < n; ++i) {
(*env)->CallVoidMethod(env, obj, jm, s, i);
if ((*env)->ExceptionCheck(env)) {
(*env)->MonitorExit(env, jc);
return;
}
}
failing to call MonitorExit in the exception case hangs the application; the second thread in Test7.java never gets to run. However, including the MonitorExit call thwarts the exception handler of the first thread in Test7.java.
*** (#4 of 5): 2005-12-14 17:08:01 PST ###@###.###
See test case Test7.* in CR: 6361259
JNI spec.....
http://java.sun.com/j2se/1.3/docs/guide/jni/spec/design.doc.html#770
"Exception Handling
There are two ways to handle an exception in native code:
* The native method can choose to return immediately, causing the exception to be thrown in the Java code that initiated the native method call.
* The native code can clear the exception by calling ExceptionClear(), and then execute its own exception-handling code.
After an exception has been raised, the native code must first clear the exception before making other JNI calls. When there is a pending exception, the only JNI functions that are safe to call are ExceptionOccurred(), ExceptionDescribe(), and ExceptionClear(). The ExceptionDescribe() function prints a debugging message about the pending exception."
There has been discussions about this matter, and depends on the VM implementation, but we
should follow the JNI spec.
*** (#3 of 5): 2005-12-14 15:26:07 PST ###@###.###
Please see http://java.sun.com/docs/books/jni/html/design.html#2193. The spec quoted in the previous evaluation comment is incorrect and should be fixed. The attached files Test7.java and Test7.c illustrate why. For example, in Test7.c
for (i = 0; i < n; ++i) {
(*env)->CallVoidMethod(env, obj, jm, s, i);
if ((*env)->ExceptionCheck(env)) {
(*env)->MonitorExit(env, jc);
return;
}
}
failing to call MonitorExit in the exception case hangs the application; the second thread in Test7.java never gets to run. However, including the MonitorExit call thwarts the exception handler of the first thread in Test7.java.
*** (#4 of 5): 2005-12-14 17:08:01 PST ###@###.###
See test case Test7.* in CR: 6361259
- duplicates
-
JDK-4973054 Need to clarify how to handle pending exceptions in JNI calls
-
- Closed
-
- relates to
-
JDK-6361259 Java 1.6 MonitorExit clears exception thrown in native code
-
- Closed
-
-
JDK-6369169 PopLocalFrame() should be safe to use when an exception is pending
-
- Closed
-