RFR: 8340005: Eliminate native access calls from javafx.swing

Kevin Rushforth kcr at openjdk.org
Tue Oct 15 16:59:17 UTC 2024


On Tue, 15 Oct 2024 03:18:09 GMT, Prasanta Sadhukhan <psadhukhan at openjdk.org> wrote:

> While implementing [JDK-8339517](https://bugs.openjdk.org/browse/JDK-8339517) to eliminate native access warnings by passing "--enable-native-access" for the three JavaFX modules with native code (javafx.graphics, javafx.media, and javafx.web), it was found  that the Swing interop code in javafx.swing calls a JNI method defined in one of the native graphics libraries (prism-common) directly
> 
> This means that even after [JDK-8339517](https://bugs.openjdk.org/browse/JDK-8339517) is fixed, we still get native access warnings when running any test that uses SwingNode.
> 
> This fixes the native access warning by making javafx.graphics module call the native JNI and Swing-interop calls the static utility method in javafx.graphics, in this case defined in PlatformImpl
> 
> All test.javafx.embed.swing SwingNode tests are running ok without any native warning

This is generally good, but I have a suggested change in the class to use for the native method.

modules/javafx.graphics/src/main/java/com/sun/javafx/application/PlatformImpl.java line 1071:

> 1069:                                                   long handle, Runnable closeWindow) {
> 1070:         _overrideNativeWindowHandle(lwFrameWrapperClass, frame, handle, closeWindow);
> 1071:     }

`PlatformImpl` is in a package / subsystem that doesn't have any native methods, and I'd prefer to keep it that way.

I recommend moving these methods to glass, probably `com.sun.glass.ui.Application`, since that will be a simple matter to cut / paste the methods from here to there.

modules/javafx.graphics/src/main/native-prism/SwingInterop.c line 31:

> 29:  * Class com_sun_javafx_application_PlatformImpl
> 30:  * Method: overrideNativeWindowHandle
> 31:  * Signature (Ljava/lang/Class;JLjava/lang/Runnable)Ljdk.swing.interop.LightweightFrameWrapper;

The signature should be changed to match the actual method. You can copy / paste from the generated header file.

Also, I recommend including the generated header file in this file (after the include of `jni.h`)

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

PR Review: https://git.openjdk.org/jfx/pull/1600#pullrequestreview-2370019002
PR Review Comment: https://git.openjdk.org/jfx/pull/1600#discussion_r1801581385
PR Review Comment: https://git.openjdk.org/jfx/pull/1600#discussion_r1801583717


More information about the openjfx-dev mailing list