RFR: 8323664: java/awt/font/JNICheck/FreeTypeScalerJNICheck.java still fails with JNI warning on some Windows configurations [v3]

Christoph Langer clanger at openjdk.org
Wed Jan 31 06:12:03 UTC 2024


On Tue, 30 Jan 2024 13:44:22 GMT, Alexey Ivanov <aivanov at openjdk.org> wrote:

>> In fact, any method can throw an exception…
>> 
>> Is there a guide which clearly states where  `ExceptionCheck` is required? The function returns a boolean indicating whether there's a pending exception. Shall we back out if there is?
>
>> Is there a guide which clearly states where `ExceptionCheck` is required?
> 
> I should've looked it up. [Java Native Interface Specification](https://docs.oracle.com/en/java/javase/21/docs/specs/jni/index.html), section on [handling Java Exception](https://docs.oracle.com/en/java/javase/21/docs/specs/jni/design.html#java-exceptions) says:
> 
> <blockquote cite="https://docs.oracle.com/en/java/javase/21/docs/specs/jni/design.html#exceptions-and-error-codes">Certain JNI functions use the Java exception mechanism to report error conditions. In most cases, JNI functions report error conditions by returning an error code and throwing a Java exception. The error code is usually a special return value (such as NULL) that is outside of the range of normal return values. Therefore, the programmer can:
> 
> * quickly check the return value of the last JNI call to determine if an error has occurred, and
> * call a function, `ExceptionOccurred()`, to obtain the exception object that contains a more detailed description of the error condition.
> 
> There are two cases where the programmer needs to check for exceptions without being able to first check an error code:
> 
> * The JNI functions that invoke a Java method return the result of the Java method. The programmer must call `ExceptionOccurred()` to check for possible exceptions that occurred during the execution of the Java method.
> * Some of the JNI array access functions do not return an error code, but may throw an `ArrayIndexOutOfBoundsException` or `ArrayStoreException`.
> 
> In all other cases, a non-error return value guarantees that no exceptions have been thrown.</blockquote>
> 
> Thus, `FindClass` returns non-null value if no error occurred; if the returned value is null, an error occurred, and `FindClass` raised an exception on the Java side.

As per https://docs.oracle.com/en/java/javase/21/docs/specs/jni/design.html#java-exceptions:

There are two cases where the programmer needs to check for exceptions without being able to first check an error code:

- The JNI functions that invoke a Java method return the result of the Java method. The programmer must call ExceptionOccurred() to check for possible exceptions that occurred during the execution of the Java method.

- Some of the JNI array access functions do not return an error code, but may throw an ArrayIndexOutOfBoundsException or ArrayStoreException.

In all other cases, a non-error return value guarantees that no exceptions have been thrown.

So, the check is needed only after `JNU_CallStaticMethodByName` for `dwmCompositionChanged` (and before other JNI activity)

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/17404#discussion_r1472347241


More information about the client-libs-dev mailing list