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