Issue in combination with JLink/JPackage
Duncan Gittins
duncan.gittins at gmail.com
Mon Feb 7 14:57:50 UTC 2022
Excuse my bad explanation, line below should read:
Because by default jextract puts multiple definitions per class, trying
to access a required symbol loads all symbols generated into the same
class. If one of those additional symbols is un-resolvable such as a
Windows global variable, the alternative branch of
RuntimeHelper.lookup() accesses ucrtbase.dll => hits the conflict with
jpackage/JavaFX.
I've tried undoing my changes for 1/2 below, removing either workaround
causes "UnsatisfiedLinkError: Native Library
C:\Windows\System32\ucrtbase.dll" regression in my application.
Kind regards
Duncan
On 07/02/2022 14:24, Duncan Gittins wrote:
> See my other email on this. I found that the issue in
> RuntimeHelper.lookup() was caused by failed symbol lookups for global
> variables that I did not depend on (and which cannot be found in DLL,
> only static LIB - so won't ever resolve in Panama?)
>
> Because jextract puts multiple definitions per class trying accessing
> a required caused failed lookups to try to access ucrtbase.dll
>
> You may be able to bypass the issue by either:
> 1) using jextract with "-Djextract.constants.per.class=0". This puts
> every symbol into own class, so when any class is loaded it does not
> trigger any unnecessary symbol lookups
> 2) use jextract with exact types so jextract only generates the exact
> set of symbols you need:
> --include-macro xyz
> --include-function xyz
>
> The above should help as long as you aren't depending on the actual
> library load of ucrtbase.dll.
>
> Kind regards
>
> Duncan
>
> On 07/02/2022 12:19, Maurizio Cimadamore wrote:
>> No problem.
>>
>> I've filed this:
>>
>> https://bugs.openjdk.java.net/browse/JDK-8281335
>>
>> Cheers
>> Maurizio
>>
>> On 07/02/2022 12:15, clemens.lanthaler at itarchitects.at wrote:
>>> Hi Maurizio,
>>>
>>> thanks allot for your help and for the investigation.
>>>
>>> best regards,
>>> Clemens
>>>
>>>
>>>> On 7. Feb 2022, at 13:03, Maurizio Cimadamore
>>>> <maurizio.cimadamore at oracle.com> wrote:
>>>>
>>>>
>>>>
>>>> Hi Clemens (it seems like your message got dropped by the mailing
>>>> list, not sure why).
>>>>
>>>> Your message seems to point at some bad interaction between
>>>> jpackage and Panama both trying to load ucrtbase.dll (and only one
>>>> can win). Apparently, the Panama code isn't executed early enough
>>>> in the jpackage case.
>>>>
>>>> We'll need to investigate more.
>>>>
>>>> Maurizio
>>>>
>>>> On 05/02/2022 15:31, Clemens Lanthaler wrote:
>>>>> Hello everybody,
>>>>>
>>>>> I am the developer of project librawfx
>>>>> (github.com/lanthale/librawfx) and the app Photoslide
>>>>> (github.com/lanthale/photoslide).
>>>>>
>>>>> At the begining of Photoslide the whole app was modularized and
>>>>> therefore all was working including librawfx which is using
>>>>> project Panama. After a while I had to change to a mixed
>>>>> (modulepath for jdk+javafx libs and classpath for the rest)
>>>>> environment and deployed my app PhotoSlide again. Under Linux and
>>>>> OSX all is working as expected. The problem exists only under
>>>>> Windows. Furthermore it exists only if I am creating a
>>>>> Jlink/Jpackage distribution. Running the app from maven was
>>>>> working as expected. Only the JPackage launcher have the issue and
>>>>> I have no clue what the root cause is.
>>>>>
>>>>> The exception I am always seeing is:
>>>>> Feb. 03, 2022 7:44:58 PM org.librawfx.RAWImageLoader load
>>>>> SCHWERWIEGEND: null
>>>>> java.lang.UnsatisfiedLinkError: Native Library
>>>>> C:\Windows\System32\ucrtbase.dll already loaded in another
>>>>> classloader
>>>>> (Full stacktrace below)
>>>>>
>>>>> How can you reproduce the issue:
>>>>>
>>>>> 1. Git clone project https://github.com/lanthale/JeditFX.git
>>>>> 2. Start the app with "mvn javafx:run at default-cli"
>>>>> 3. Click on the open icon in the toolbar and select file
>>>>> "...\Documents\NetBeansProjects\JeditFX\JeditFX\src\main\resources\RAW-ADOBE_DNG_Sample.dng"
>>>>>
>>>>> 4. The app is showing the image below the textarea
>>>>> 5. Create the jlink/jpackage app-image with "mvn -Ppackage clean
>>>>> install"
>>>>> 6. Start the exe jeditfx.exe in directory ".\target\jeditfx"
>>>>> 7. Open the same file again -> No image is shown below the text
>>>>> area and the exception is thrown in the background
>>>>>
>>>>>
>>>>> I have tried many things but it is only happening if I have
>>>>> OpenJFX+JDK Modules on the module path and the rest of the jar
>>>>> files on the classpath. All libs which are not having any Panama
>>>>> code inside of the app are working perfectly and it is only
>>>>> happening on Windows.
>>>>>
>>>>> Thank you in advance for your help!
>>>>>
>>>>> best regards,
>>>>> Clemens
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> *Full stacktrace from Photoslide:*
>>>>>
>>>>> Feb. 03, 2022 7:44:41 PM org.photoslide.search.SearchIndex
>>>>> createSearchIndex
>>>>> INFORMATION: Start time create searchDB: 2022-02-03T19:44:41.693455
>>>>> Feb. 03, 2022 7:44:42 PM org.photoslide.SoftwareUpdater
>>>>> lambda$checkForSoftwareUpdates$2
>>>>> INFORMATION: No new version found!
>>>>> Feb. 03, 2022 7:44:43 PM org.photoslide.search.SearchIndex
>>>>> lambda$createSearchIndex$0
>>>>> INFORMATION: End time create searchDB: 2022-02-03T19:44:43.186194400
>>>>> Feb. 03, 2022 7:44:58 PM org.librawfx.RAWImageLoader load
>>>>> SCHWERWIEGEND: null
>>>>> java.lang.UnsatisfiedLinkError: Native Library
>>>>> C:\Windows\System32\ucrtbase.dll already loaded in another
>>>>> classloader
>>>>> at
>>>>> java.base/jdk.internal.loader.NativeLibraries.loadLibrary(Unknown
>>>>> Source)
>>>>> at
>>>>> java.base/jdk.internal.loader.NativeLibraries.loadLibrary(Unknown
>>>>> Source)
>>>>> at
>>>>> jdk.incubator.foreign/jdk.internal.foreign.SystemLookup.lambda$makeWindowsLookup$1(Unknown
>>>>> Source)
>>>>> at
>>>>> jdk.incubator.foreign/jdk.internal.foreign.SystemLookup.libLookup(Unknown
>>>>> Source)
>>>>> at
>>>>> jdk.incubator.foreign/jdk.internal.foreign.SystemLookup.makeWindowsLookup(Unknown
>>>>> Source)
>>>>> at
>>>>> jdk.incubator.foreign/jdk.internal.foreign.SystemLookup.(Unknown
>>>>> Source)
>>>>> at
>>>>> jdk.incubator.foreign/jdk.incubator.foreign.CLinker.systemLookup(Unknown
>>>>> Source)
>>>>> at org.libraw.win.RuntimeHelper.lookup(RuntimeHelper.java:33)
>>>>> at org.libraw.win.libraw_h.(libraw_h.java:15)
>>>>> at
>>>>> org.librawfx.LibrawImage.readPixelDataFromStream(LibrawImage.java:113)
>>>>>
>>>>> at org.librawfx.RAWImageLoader.getImageData(RAWImageLoader.java:168)
>>>>> at org.librawfx.RAWImageLoader.load(RAWImageLoader.java:84)
>>>>> at
>>>>> javafx.graphics at 18-ea/com.sun.javafx.iio.ImageStorage.loadAll(Unknown
>>>>> Source)
>>>>> at
>>>>> javafx.graphics at 18-ea/com.sun.javafx.iio.ImageStorage.loadAll(Unknown
>>>>> Source)
>>>>> at
>>>>> javafx.graphics at 18-ea/com.sun.javafx.tk.quantum.PrismImageLoader2.loadAll(Unknown
>>>>> Source)
>>>>> at
>>>>> javafx.graphics at 18-ea/com.sun.javafx.tk.quantum.PrismImageLoader2.(Unknown
>>>>> Source)
>>>>> at
>>>>> javafx.graphics at 18-ea/com.sun.javafx.tk.quantum.QuantumToolkit.loadImage(Unknown
>>>>> Source)
>>>>> at
>>>>> javafx.graphics at 18-ea/javafx.scene.image.Image.loadImage(Unknown
>>>>> Source)
>>>>> at
>>>>> javafx.graphics at 18-ea/javafx.scene.image.Image.initialize(Unknown
>>>>> Source)
>>>>> at javafx.graphics at 18-ea/javafx.scene.image.Image.(Unknown Source)
>>>>> at
>>>>> org.photoslide.datamodel.MediaFileLoader$1.call(MediaFileLoader.java:46)
>>>>>
>>>>> at
>>>>> org.photoslide.datamodel.MediaFileLoader$1.call(MediaFileLoader.java:43)
>>>>>
>>>>> at
>>>>> javafx.graphics at 18-ea/javafx.concurrent.Task$TaskCallable.call(Unknown
>>>>> Source)
>>>>> at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
>>>>> at
>>>>> java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown
>>>>> Source)
>>>>> at java.base/java.util.concurrent.FutureTask.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 java.base/java.lang.Thread.run(Unknown Source)
>
>
More information about the panama-dev
mailing list