Dansoftowner / Boomega

A modern book explorer/catalog application written in Kotlin and Java.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

UnsatisfiedLinkError when running the program as a native app on Windows

Dansoftowner opened this issue · comments

I noticed an error in the native Boomega release. The interesting thing was that the app worked on other computers but not on mine.

The gui window didn't work:
image

And the error was:

java.lang.UnsatisfiedLinkError: 'boolean com.sun.javafx.font.directwrite.OS.CoInitializeEx(int)'
        at javafx.graphics/com.sun.javafx.font.directwrite.OS.CoInitializeEx(Native Method)
        at javafx.graphics/com.sun.javafx.font.directwrite.DWFactory.getWICFactory(Unknown Source)
        at javafx.graphics/com.sun.javafx.font.directwrite.DWGlyph.createBitmap(Unknown Source)
        at javafx.graphics/com.sun.javafx.font.directwrite.DWGlyph.getCachedBitmap(Unknown Source)
        at javafx.graphics/com.sun.javafx.font.directwrite.DWGlyph.getD2DMask(Unknown Source)
        at javafx.graphics/com.sun.javafx.font.directwrite.DWGlyph.getPixelData(Unknown Source)
        at javafx.graphics/com.sun.prism.impl.GlyphCache.getCachedGlyph(Unknown Source)
        at javafx.graphics/com.sun.prism.impl.GlyphCache.render(Unknown Source)
        at javafx.graphics/com.sun.prism.impl.ps.BaseShaderGraphics.drawString(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGText.renderText(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGText.renderContent2D(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGShape.renderContent(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NodeEffectInput.getImageDataForBoundedNode(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NodeEffectInput.filter(Unknown Source)
        at javafx.graphics/com.sun.scenario.effect.FilterEffect.filter(Unknown Source)
        at javafx.graphics/com.sun.scenario.effect.Offset.filter(Unknown Source)
        at javafx.graphics/com.sun.scenario.effect.Merge.filter(Unknown Source)
        at javafx.graphics/com.sun.scenario.effect.DelegateEffect.filter(Unknown Source)
        at javafx.graphics/com.sun.scenario.effect.impl.prism.PrEffectHelper.render(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.EffectFilter.render(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGNode.renderEffect(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGNode.renderForClip(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGNode.renderRectClip(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGNode.renderClip(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGGroup.renderContent(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGRegion.renderContent(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGNode.doRender(Unknown Source)
        at javafx.graphics/com.sun.javafx.sg.prism.NGNode.render(Unknown Source)
        at javafx.graphics/com.sun.javafx.tk.quantum.ViewPainter.doPaint(Unknown Source)
        at javafx.graphics/com.sun.javafx.tk.quantum.ViewPainter.paintImpl(Unknown Source)
        at javafx.graphics/com.sun.javafx.tk.quantum.PresentingPainter.run(Unknown Source)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
        at java.base/java.util.concurrent.FutureTask.runAndReset(Unknown Source)
        at javafx.graphics/com.sun.javafx.tk.RenderJob.run(Unknown Source)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at javafx.graphics/com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(Unknown Source)
        at java.base/java.lang.Thread.run(Unknown Source)

Then I enabled more verbose logging by -Djavafx.verbose=true and -Dprism.verbose=true.
And I've got interesting results.

I noticed that most of the DLLs weren't loaded from the local java runtime but from the system java distribution (btw a ZuluFX 11) that was located on the PATH.

Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-core-console-l1-1-0.dll from java.library.path
System.loadLibrary(api-ms-win-core-console-l1-2-0) succeeded
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-core-datetime-l1-1-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-core-debug-l1-1-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-core-errorhandling-l1-1-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-core-file-l1-1-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-core-file-l1-2-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-core-file-l2-1-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-core-handle-l1-1-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-core-heap-l1-1-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-core-interlocked-l1-1-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-core-libraryloader-l1-1-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-core-localization-l1-2-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-core-memory-l1-1-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-core-namedpipe-l1-1-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-core-processenvironment-l1-1-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-core-processthreads-l1-1-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-core-processthreads-l1-1-1.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-core-profile-l1-1-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-core-rtlsupport-l1-1-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-core-string-l1-1-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-core-synch-l1-1-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-core-synch-l1-2-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-core-sysinfo-l1-1-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-core-timezone-l1-1-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-core-util-l1-1-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-crt-conio-l1-1-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-crt-convert-l1-1-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-crt-environment-l1-1-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-crt-filesystem-l1-1-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-crt-heap-l1-1-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-crt-locale-l1-1-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-crt-math-l1-1-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-crt-multibyte-l1-1-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-crt-private-l1-1-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-crt-process-l1-1-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-crt-runtime-l1-1-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-crt-stdio-l1-1-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-crt-string-l1-1-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-crt-time-l1-1-0.dll from java.library.path
Loaded C:\Program Files\Java\zulu11.37.19-ca-fx-jdk11.0.6-win_x64\bin\api-ms-win-crt-utility-l1-1-0.dll from java.library.path
Loaded C:\WINDOWS\system32\ucrtbase.dll from java.library.path
Loaded C:\WINDOWS\system32\vcruntime140.dll from java.library.path
Loaded C:\WINDOWS\system32\vcruntime140_1.dll from java.library.path
Loaded C:\WINDOWS\system32\msvcp140.dll from java.library.path

After I removed the Java 11 distribution from my PATH, the app loaded the DLLs from its local runtime and worked 100% fine.

System.loadLibrary(api-ms-win-core-console-l1-1-0) succeeded
System.loadLibrary(api-ms-win-core-console-l1-2-0) succeeded
System.loadLibrary(api-ms-win-core-datetime-l1-1-0) succeeded
System.loadLibrary(api-ms-win-core-debug-l1-1-0) succeeded
System.loadLibrary(api-ms-win-core-errorhandling-l1-1-0) succeeded
System.loadLibrary(api-ms-win-core-file-l1-1-0) succeeded
System.loadLibrary(api-ms-win-core-file-l1-2-0) succeeded
System.loadLibrary(api-ms-win-core-file-l2-1-0) succeeded
System.loadLibrary(api-ms-win-core-handle-l1-1-0) succeeded
System.loadLibrary(api-ms-win-core-heap-l1-1-0) succeeded
System.loadLibrary(api-ms-win-core-interlocked-l1-1-0) succeeded
System.loadLibrary(api-ms-win-core-libraryloader-l1-1-0) succeeded
System.loadLibrary(api-ms-win-core-localization-l1-2-0) succeeded
System.loadLibrary(api-ms-win-core-memory-l1-1-0) succeeded
System.loadLibrary(api-ms-win-core-namedpipe-l1-1-0) succeeded
System.loadLibrary(api-ms-win-core-processenvironment-l1-1-0) succeeded
System.loadLibrary(api-ms-win-core-processthreads-l1-1-0) succeeded
System.loadLibrary(api-ms-win-core-processthreads-l1-1-1) succeeded
System.loadLibrary(api-ms-win-core-profile-l1-1-0) succeeded
System.loadLibrary(api-ms-win-core-rtlsupport-l1-1-0) succeeded
System.loadLibrary(api-ms-win-core-string-l1-1-0) succeeded
System.loadLibrary(api-ms-win-core-synch-l1-1-0) succeeded
System.loadLibrary(api-ms-win-core-synch-l1-2-0) succeeded
System.loadLibrary(api-ms-win-core-sysinfo-l1-1-0) succeeded
System.loadLibrary(api-ms-win-core-timezone-l1-1-0) succeeded
System.loadLibrary(api-ms-win-core-util-l1-1-0) succeeded
System.loadLibrary(api-ms-win-crt-conio-l1-1-0) succeeded
System.loadLibrary(api-ms-win-crt-convert-l1-1-0) succeeded
System.loadLibrary(api-ms-win-crt-environment-l1-1-0) succeeded
System.loadLibrary(api-ms-win-crt-filesystem-l1-1-0) succeeded
System.loadLibrary(api-ms-win-crt-heap-l1-1-0) succeeded
System.loadLibrary(api-ms-win-crt-locale-l1-1-0) succeeded
System.loadLibrary(api-ms-win-crt-math-l1-1-0) succeeded
System.loadLibrary(api-ms-win-crt-multibyte-l1-1-0) succeeded
System.loadLibrary(api-ms-win-crt-private-l1-1-0) succeeded
System.loadLibrary(api-ms-win-crt-process-l1-1-0) succeeded
System.loadLibrary(api-ms-win-crt-runtime-l1-1-0) succeeded
System.loadLibrary(api-ms-win-crt-stdio-l1-1-0) succeeded
System.loadLibrary(api-ms-win-crt-string-l1-1-0) succeeded
System.loadLibrary(api-ms-win-crt-time-l1-1-0) succeeded
System.loadLibrary(api-ms-win-crt-utility-l1-1-0) succeeded
Loaded C:\WINDOWS\system32\ucrtbase.dll from java.library.path
Loaded C:\WINDOWS\system32\vcruntime140.dll from java.library.path
Loaded C:\WINDOWS\system32\vcruntime140_1.dll from java.library.path
Loaded C:\WINDOWS\system32\msvcp140.dll from java.library.path

Fixed by prefixing the java.library.path with the running java runtime path.