JavaFX Launch Failure on Ubuntu from JNI
Steve Hannah
steve at weblite.ca
Fri Feb 11 22:22:29 UTC 2022
Just wanted to share that I sorted out all of my issues with this launcher,
and I'm proud to present the result:
jDeploy
https://www.jdeploy.com
You can now deploy your JavaFX apps as native bundles to your Mac, Linux,
and Windows users without requiring a Mac/Windows/Linux box to produce the
native bundle. You don't need to deal with codesigning/notarizing on Mac
either. Install bundles are small (3mb compressed). When you publish
updates, your users will get them automatically on next launch.
Please take it for a spin and let me know what you think. Happy to answer
any questions.
On Mon, Jan 24, 2022 at 9:48 AM Steve Hannah <steve at weblite.ca> wrote:
> I just wanted to follow up with this in case someone comes across this
> thread later.
>
> After thoroughly exploring the landscape, I found that the issue on Ubuntu
> was caused by a conflict between the webkit2gtk-4.0 library (which I was
> using to show a progress dialog in the case that the JRE or app needs to
> download an update). Additionally it seemed to have a problem with just
> the general gtk+-3.0 dependency, if GTK was initialized before JavaFX was
> loaded.
> I worked around the gtk+-3.0 issue by breaking the GTK stuff into a
> separate process (calling itself with different args). This workaround was
> not sufficient to resolve the webkit2gtk-4.0 conflict as, even if it wasn't
> used at runtime, it would still conflict with JavaFX's webview - resulting
> in a segfault. The only solution was to remove the webkit2gtk-4.0
> dependency entirely from my app, and do the progress dialog differently (I
> ended up just using basic GTK widgets).
>
> Best regards
>
> Steve
>
>
>
> On Wed, Jan 19, 2022 at 9:40 AM Steve Hannah <steve at weblite.ca> wrote:
>
>> The following issue only seems to occur on Linux (Ubuntu 20.04.1), and
>> only when I try to launch the JVM from a custom C launcher using JNI. It
>> does not occur when launching the JVM as a separate process using the
>> "java" binary. It also does not occur on MacOS when using the same C
>> launcher using JNI.
>>
>> When I call MyApplication.launch(args). (where MyApplication extends the
>> JavaFX Application class), I get the following stack trace:
>>
>> Jan. 19, 2022 8:54:27 A.M. com.sun.javafx.application.PlatformImpl startup
>> Exception in thread "Thread-5" java.lang.IllegalStateException: This operation is permitted on the event thread only; currentThread = Thread-5
>> at com.sun.glass.ui.Application.checkEventThread(Application.java:447)
>> at com.sun.glass.ui.Application.setName(Application.java:200)
>> at com.sun.javafx.application.PlatformImpl.lambda$setApplicationName$2(PlatformImpl.java:142)
>> at com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:457)
>> at java.base/java.security.AccessController.doPrivileged(Native Method)
>> at com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:456)
>> at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
>> Exception in Application start method
>> Exception in thread "Thread-31" Failed to show docs
>> java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-31
>> at com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:295)
>> at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:458)
>> at com.sun.javafx.tk.quantum.QuantumToolkit.exit(QuantumToolkit.java:828)
>> at com.sun.javafx.application.PlatformImpl.lambda$tkExit$16(PlatformImpl.java:624)
>> at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:484)
>> at com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:457)
>> at java.base/java.security.AccessController.doPrivileged(Native Method)
>> at com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:456)
>> at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
>> java.lang.RuntimeException: Exception in Application start method
>> at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:901)
>> at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:196)
>> at java.base/java.lang.Thread.run(Thread.java:829)
>> Caused by: java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-6
>> at com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:295)
>> at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:458)
>> at javafx.stage.Stage.<init>(Stage.java:254)
>> at javafx.stage.Stage.<init>(Stage.java:240)
>> at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:845)
>> at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:484)
>> at com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:457)
>> at java.base/java.security.AccessController.doPrivileged(Native Method)
>> at com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:456)
>> at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
>>
>>
>> I have tried a few different versions of JavaFX (11, 11.0.2, 17.0.1),
>> running on a few different JDK installs (all JDK11). Above stacktrace is
>> from 17.0.1.
>>
>> From the C application that launches the JVM, I have tried running
>> directly on the main thread, and also launching it in a fresh thread using
>> pthreads - but same issue. I am running this inside an application written
>> in Go but the JNI code is all in C.
>>
>> It appears as though JavaFX is unable to create its application thread
>> for some reason. Does anyone have any suggestions on reasons why this
>> would be the case? Are there some system properties that need to be there
>> which would have been bootstrapped by the "java" binary, but would not when
>> the JVM is launched via JNI?
>>
>> Any suggestions appreciated. I've been banging my head on this for a
>> while now.
>>
>> Best regards
>>
>> Steve
>>
>
>
> --
> Steve Hannah
> Web Lite Solutions Corp.
>
--
Steve Hannah
Web Lite Solutions Corp.
More information about the openjfx-dev
mailing list