Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[native-image] Code using JavaFX fails to generate native image. #365

Closed
rhencke opened this issue Apr 21, 2018 · 6 comments
Closed

[native-image] Code using JavaFX fails to generate native image. #365

rhencke opened this issue Apr 21, 2018 · 6 comments
Assignees

Comments

@rhencke
Copy link

rhencke commented Apr 21, 2018

When attempting to generate a native image using code that uses JavaFX, an error occurs. I can't exactly understand the root cause given the error message, but I can give the steps to reproduce it.

  1. Create a file HelloWorld.java, containing the example in Example 1-1 at https://docs.oracle.com/javafx/2/get_started/hello_world.htm
  2. Using the Graal toolchain (in this case, graalvm-1.0.0-rc1 from Oracle download was used, on MacOS), compile the Java file: javac HelloWorld.java
  3. Run the native image compiler: native-image -cp . helloworld.HelloWorld

The following error is then shown:

Build on Server(pid: 19186, port: 26681)
   classlist:     120.71 ms
       (cap):   1,658.04 ms
       setup:   1,967.81 ms
    analysis:   2,664.79 ms
error: unsupported features in 6 methods
Detailed message:
Error: Error loading a referenced type: java.lang.NoClassDefFoundError: Could not initialize class javafx.stage.Screen
Trace:
	at parsing com.sun.javafx.tk.quantum.QuantumToolkit.initSceneGraph(QuantumToolkit.java:298)
Call path from entry point to com.sun.javafx.tk.quantum.QuantumToolkit.initSceneGraph():
	at com.sun.javafx.tk.quantum.QuantumToolkit.initSceneGraph(QuantumToolkit.java:298)
	at com.sun.javafx.tk.quantum.QuantumToolkit.runToolkit(QuantumToolkit.java:340)
	at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$startup$402(QuantumToolkit.java:257)
	at com.sun.javafx.tk.quantum.QuantumToolkit$$Lambda$611/1642062728.run(Unknown Source)
	at com.oracle.svm.core.JavaMainWrapper$JavaMainSupport.executeHooks(JavaMainWrapper.java:105)
	at com.oracle.svm.core.JavaMainWrapper$JavaMainSupport.executeStartupHooks(JavaMainWrapper.java:91)
	at com.oracle.svm.core.JavaMainWrapper.run(JavaMainWrapper.java:198)
	at Lcom/oracle/svm/core/code/CEntryPointCallStubs;.com_002eoracle_002esvm_002ecore_002eJavaMainWrapper_002erun_0028int_002corg_002egraalvm_002enativeimage_002ec_002etype_002eCCharPointerPointer_0029(generated:0)
Original exception that caused the problem: java.lang.NoClassDefFoundError: Could not initialize class javafx.stage.Screen
	at sun.misc.Unsafe.ensureClassInitialized(Native Method)
	at jdk.vm.ci.hotspot.HotSpotConstantPool.loadReferencedType(HotSpotConstantPool.java:695)
	at com.oracle.graal.pointsto.infrastructure.WrappedConstantPool.loadReferencedType(WrappedConstantPool.java:58)
	at org.graalvm.compiler.java.BytecodeParser.maybeEagerlyResolve(BytecodeParser.java:3847)
	at com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.maybeEagerlyResolve(SharedGraphBuilderPhase.java:102)
	at org.graalvm.compiler.java.BytecodeParser.lookupMethod(BytecodeParser.java:3801)
	at org.graalvm.compiler.java.BytecodeParser.genInvokeStatic(BytecodeParser.java:1380)
	at com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.genInvokeStatic(SharedGraphBuilderPhase.java:171)
	at org.graalvm.compiler.java.BytecodeParser.processBytecode(BytecodeParser.java:4677)
	at org.graalvm.compiler.java.BytecodeParser.iterateBytecodesForBlock(BytecodeParser.java:3065)
	at org.graalvm.compiler.java.BytecodeParser.processBlock(BytecodeParser.java:2886)
	at org.graalvm.compiler.java.BytecodeParser.build(BytecodeParser.java:880)
	at org.graalvm.compiler.java.BytecodeParser.buildRootMethod(BytecodeParser.java:774)
	at org.graalvm.compiler.java.GraphBuilderPhase$Instance.run(GraphBuilderPhase.java:93)
	at org.graalvm.compiler.phases.Phase.run(Phase.java:47)
	at org.graalvm.compiler.phases.BasePhase.apply(BasePhase.java:195)
	at org.graalvm.compiler.phases.Phase.apply(Phase.java:40)
	at org.graalvm.compiler.phases.Phase.apply(Phase.java:36)
	at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.parse(MethodTypeFlowBuilder.java:195)
	at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.apply(MethodTypeFlowBuilder.java:319)
	at com.oracle.graal.pointsto.flow.MethodTypeFlow.doParse(MethodTypeFlow.java:308)
	at com.oracle.graal.pointsto.flow.MethodTypeFlow.ensureParsed(MethodTypeFlow.java:298)
	at com.oracle.graal.pointsto.flow.MethodTypeFlow.addContext(MethodTypeFlow.java:105)
	at com.oracle.graal.pointsto.flow.StaticInvokeTypeFlow.update(InvokeTypeFlow.java:344)
	at com.oracle.graal.pointsto.BigBang$2.run(BigBang.java:498)
	at com.oracle.graal.pointsto.util.CompletionExecutor.lambda$execute$0(CompletionExecutor.java:172)
	at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1402)
	at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
	at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
	at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
	at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Error: Error loading a referenced type: java.lang.NoClassDefFoundError: Could not initialize class javafx.stage.Screen
Trace:
	at parsing javafx.stage.Window.<init>(Window.java:1209)
Call path from entry point to javafx.stage.Window.<init>():
	at javafx.stage.Window.<init>(Window.java:155)
	at javafx.stage.Stage.<init>(Stage.java:239)
	at javafx.stage.Stage.<init>(Stage.java:227)
	at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$159(LauncherImpl.java:783)
	at com.sun.javafx.application.LauncherImpl$$Lambda$546/1165191125.run(Unknown Source)
	at com.oracle.svm.core.JavaMainWrapper$JavaMainSupport.executeHooks(JavaMainWrapper.java:105)
	at com.oracle.svm.core.JavaMainWrapper$JavaMainSupport.executeStartupHooks(JavaMainWrapper.java:91)
	at com.oracle.svm.core.JavaMainWrapper.run(JavaMainWrapper.java:198)
	at Lcom/oracle/svm/core/code/CEntryPointCallStubs;.com_002eoracle_002esvm_002ecore_002eJavaMainWrapper_002erun_0028int_002corg_002egraalvm_002enativeimage_002ec_002etype_002eCCharPointerPointer_0029(generated:0)
Original exception that caused the problem: java.lang.NoClassDefFoundError: Could not initialize class javafx.stage.Screen
	at sun.misc.Unsafe.ensureClassInitialized(Native Method)
	at jdk.vm.ci.hotspot.HotSpotConstantPool.loadReferencedType(HotSpotConstantPool.java:695)
	at com.oracle.graal.pointsto.infrastructure.WrappedConstantPool.loadReferencedType(WrappedConstantPool.java:58)
	at org.graalvm.compiler.java.BytecodeParser.maybeEagerlyResolve(BytecodeParser.java:3847)
	at com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.maybeEagerlyResolve(SharedGraphBuilderPhase.java:102)
	at org.graalvm.compiler.java.BytecodeParser.lookupMethod(BytecodeParser.java:3801)
	at org.graalvm.compiler.java.BytecodeParser.genInvokeStatic(BytecodeParser.java:1380)
	at com.oracle.svm.hosted.phases.SharedGraphBuilderPhase$SharedBytecodeParser.genInvokeStatic(SharedGraphBuilderPhase.java:171)
	at org.graalvm.compiler.java.BytecodeParser.processBytecode(BytecodeParser.java:4677)
	at org.graalvm.compiler.java.BytecodeParser.iterateBytecodesForBlock(BytecodeParser.java:3065)
	at org.graalvm.compiler.java.BytecodeParser.processBlock(BytecodeParser.java:2886)
	at org.graalvm.compiler.java.BytecodeParser.build(BytecodeParser.java:880)
	at org.graalvm.compiler.java.BytecodeParser.buildRootMethod(BytecodeParser.java:774)
	at org.graalvm.compiler.java.GraphBuilderPhase$Instance.run(GraphBuilderPhase.java:93)
	at org.graalvm.compiler.phases.Phase.run(Phase.java:47)
	at org.graalvm.compiler.phases.BasePhase.apply(BasePhase.java:195)
	at org.graalvm.compiler.phases.Phase.apply(Phase.java:40)
	at org.graalvm.compiler.phases.Phase.apply(Phase.java:36)
	at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.parse(MethodTypeFlowBuilder.java:195)
	at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.apply(MethodTypeFlowBuilder.java:319)
	at com.oracle.graal.pointsto.flow.MethodTypeFlow.doParse(MethodTypeFlow.java:308)
	at com.oracle.graal.pointsto.flow.MethodTypeFlow.ensureParsed(MethodTypeFlow.java:298)
	at com.oracle.graal.pointsto.flow.MethodTypeFlow.addContext(MethodTypeFlow.java:105)
	at com.oracle.graal.pointsto.flow.SpecialInvokeTypeFlow.onObservedUpdate(InvokeTypeFlow.java:419)
	at com.oracle.graal.pointsto.flow.TypeFlow.notifyObservers(TypeFlow.java:345)
	at com.oracle.graal.pointsto.flow.TypeFlow.update(TypeFlow.java:387)
	at com.oracle.graal.pointsto.BigBang$2.run(BigBang.java:498)
	at com.oracle.graal.pointsto.util.CompletionExecutor.lambda$execute$0(CompletionExecutor.java:172)
	at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1402)
	at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
	at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
	at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
	at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Error: Must not have a started Thread in the image heap.
Trace: 	object com.sun.javafx.tk.quantum.QuantumRenderer
	object java.util.concurrent.atomic.AtomicReference
	method com.sun.javafx.tk.quantum.QuantumRenderer.getInstance()
Call path from entry point to com.sun.javafx.tk.quantum.QuantumRenderer.getInstance():
	at com.sun.javafx.tk.quantum.QuantumRenderer.getInstance(QuantumRenderer.java:258)
	at com.sun.javafx.tk.quantum.QuantumToolkit.init(QuantumToolkit.java:221)
	at com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:248)
	at com.sun.javafx.application.PlatformImpl.lambda$tkExit$177(PlatformImpl.java:450)
	at com.sun.javafx.application.PlatformImpl$$Lambda$555/2063860391.run(Unknown Source)
	at com.oracle.svm.core.JavaMainWrapper$JavaMainSupport.executeHooks(JavaMainWrapper.java:105)
	at com.oracle.svm.core.JavaMainWrapper$JavaMainSupport.executeStartupHooks(JavaMainWrapper.java:91)
	at com.oracle.svm.core.JavaMainWrapper.run(JavaMainWrapper.java:198)
	at Lcom/oracle/svm/core/code/CEntryPointCallStubs;.com_002eoracle_002esvm_002ecore_002eJavaMainWrapper_002erun_0028int_002corg_002egraalvm_002enativeimage_002ec_002etype_002eCCharPointerPointer_0029(generated:0)
Error: Must not have a started Thread in the image heap.
Trace: 	field com.sun.prism.es2.ES2Pipeline.creator
Error: Must not have a started Thread in the image heap.
Trace: 	object java.util.concurrent.ThreadPoolExecutor$Worker
	object java.util.HashMap$Node
	object java.util.HashMap$Node[]
	object java.util.HashMap
	object java.util.HashSet
	object com.sun.javafx.tk.quantum.QuantumRenderer
	object java.util.concurrent.atomic.AtomicReference
	method com.sun.javafx.tk.quantum.QuantumRenderer.getInstance()
Call path from entry point to com.sun.javafx.tk.quantum.QuantumRenderer.getInstance():
	at com.sun.javafx.tk.quantum.QuantumRenderer.getInstance(QuantumRenderer.java:258)
	at com.sun.javafx.tk.quantum.QuantumToolkit.init(QuantumToolkit.java:221)
	at com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:248)
	at com.sun.javafx.application.PlatformImpl.lambda$tkExit$177(PlatformImpl.java:450)
	at com.sun.javafx.application.PlatformImpl$$Lambda$555/2063860391.run(Unknown Source)
	at com.oracle.svm.core.JavaMainWrapper$JavaMainSupport.executeHooks(JavaMainWrapper.java:105)
	at com.oracle.svm.core.JavaMainWrapper$JavaMainSupport.executeStartupHooks(JavaMainWrapper.java:91)
	at com.oracle.svm.core.JavaMainWrapper.run(JavaMainWrapper.java:198)
	at Lcom/oracle/svm/core/code/CEntryPointCallStubs;.com_002eoracle_002esvm_002ecore_002eJavaMainWrapper_002erun_0028int_002corg_002egraalvm_002enativeimage_002ec_002etype_002eCCharPointerPointer_0029(generated:0)
Error: Must not have a started Thread in the image heap.
Trace: 	object java.util.concurrent.locks.AbstractQueuedSynchronizer$Node
	object java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject
	object java.util.concurrent.LinkedBlockingQueue
	object com.sun.javafx.tk.quantum.QuantumRenderer
	object java.util.concurrent.atomic.AtomicReference
	method com.sun.javafx.tk.quantum.QuantumRenderer.getInstance()
Call path from entry point to com.sun.javafx.tk.quantum.QuantumRenderer.getInstance():
	at com.sun.javafx.tk.quantum.QuantumRenderer.getInstance(QuantumRenderer.java:258)
	at com.sun.javafx.tk.quantum.QuantumToolkit.init(QuantumToolkit.java:221)
	at com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:248)
	at com.sun.javafx.application.PlatformImpl.lambda$tkExit$177(PlatformImpl.java:450)
	at com.sun.javafx.application.PlatformImpl$$Lambda$555/2063860391.run(Unknown Source)
	at com.oracle.svm.core.JavaMainWrapper$JavaMainSupport.executeHooks(JavaMainWrapper.java:105)
	at com.oracle.svm.core.JavaMainWrapper$JavaMainSupport.executeStartupHooks(JavaMainWrapper.java:91)
	at com.oracle.svm.core.JavaMainWrapper.run(JavaMainWrapper.java:198)
	at Lcom/oracle/svm/core/code/CEntryPointCallStubs;.com_002eoracle_002esvm_002ecore_002eJavaMainWrapper_002erun_0028int_002corg_002egraalvm_002enativeimage_002ec_002etype_002eCCharPointerPointer_0029(generated:0)

Error: Processing image build request failed

If you need more information, please let me know. Thanks.

@khengsdijk

This comment has been minimized.

@cstancu cstancu self-assigned this Apr 24, 2018
@cstancu
Copy link
Member

cstancu commented May 4, 2018

@rhencke thank you for your report. He haven't tried running JavaFX apps so far. It looks like they will need a bit more work to run on SubstrateVM.
Related issue: #403.

@tisonkun
Copy link
Contributor

tisonkun commented May 4, 2018

For cross refer #358

@cubuspl42
Copy link

Managed to make it build, but doesn't run properly: #994

@hrgdavor
Copy link

Are there any plans to look into javafx ? just wondering footprint that it would have, would it be useful to develop small desktop apps.

@cstancu
Copy link
Member

cstancu commented Dec 23, 2019

As reported by #403 (comment) it is now possible to create native executables for JavaFX applications on Linux, MacOS and iOS. I am closing this issue, please open a new one if you run into further issues.

@cstancu cstancu closed this as completed Dec 23, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

7 participants