Issue in combination with JLink/JPackage

clemens.lanthaler at itarchitects.at clemens.lanthaler at itarchitects.at
Mon Feb 7 15:32:05 UTC 2022


Ok I will try your first workaround with jextract flag and see if something is going better. 

> On 7. Feb 2022, at 15:57, Duncan Gittins <duncan.gittins at gmail.com> wrote:
> 
> 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