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