Issue in combination with JLink/JPackage

Duncan Gittins duncan.gittins at gmail.com
Sun Feb 20 21:04:23 UTC 2022


Maurizio

I setup my sample javafx/jpackage app to use your minimal test case as a 
JavaFX button action handler:

System.load("C:\\Windows\\System32\\ucrtbase.dll");
     Optional<NativeSymbol> sym = CLinker.systemCLinker().lookup("foo");

As noted, the above fails in current EA release: 
java.lang.UnsatisfiedLinkError: Native Library 
C:\Windows\System32\ucrtbase.dll already loaded in another classload, 
and it works fine after building / running from current Panama repo pull.

Kind regards

Duncan

On 18/02/2022 22:16, Maurizio Cimadamore wrote:
> Hi Clemens,
> no worries - I will let you know when we have an EA with the fix 
> available (we'll probably wait to accumulate some other fixes/features 
> as well).
>
> Thanks
> Maurizio
>
> On 18/02/2022 22:04, Clemens Lanthaler wrote:
>> Hi,
>> Thanks allot for the info. I have seen that the fix will be part of 
>> JDK19 and frankly speeking I have never build a jdk by myself. I 
>> would appreciate if there is a chance to get a binary of this pre 
>> build including panama.
>>
>> Thank you in advance.
>>
>> best regards,
>> Clemens
>>
>>> Maurizio Cimadamore <maurizio.cimadamore at oracle.com> hat am 
>>> 18.02.2022 15:30 geschrieben:
>>>
>>>
>>> Hi,
>>> quick update on this. The problem with library loading in JDK being too
>>> strict for Panama has been fixed upstream (thanks Mandy!):
>>>
>>> https://git.openjdk.java.net/jdk/pull/7435
>>>
>>>
>>> We've just merged those changes into the Panama repo - which means 
>>> that,
>>> if you build the latest version of the repo, you should be able to
>>> verify that the workarounds are no longer required.
>>>
>>> Please let us know how that goes.
>>>
>>> Cheers
>>> Maurizio
>>>
>>> On 10/02/2022 10:05, Maurizio Cimadamore wrote:
>>>> I have managed to create a simple reproducer on Windows:
>>>> import jdk.incubator.foreign.CLinker;
>>>> public class TestLookup {
>>>>     public static void main(String[] args) {
>>>> System.load("C:\\Windows\\System32\\ucrtbase.dll");
>>>>         CLinker.systemCLinker().lookup("foo");
>>>>     }
>>>> }
>>>> The call to CLinker::lookup fails with UnsatisfiedLinkError as
>>>> ucrtbase is already loaded by the application class loader.
>>>> This seems to be a bug in the library loading mechanism - we do have a
>>>> "raw" library loading mechanism that is not subject to JNI 
>>>> restrictions:
>>>> https://github.com/openjdk/jdk/blob/309acbf0e86a0d248294503fccc7a936fa0a846e/src/java.base/share/classes/jdk/internal/loader/NativeLibraries.java#L99 
>>>> <https://urldefense.com/v3/__https://github.com/openjdk/jdk/blob/309acbf0e86a0d248294503fccc7a936fa0a846e/src/java.base/share/classes/jdk/internal/loader/NativeLibraries.java*L99__;Iw!!ACWV5N9M2RV99hQ!bOgtuoBaY3YrzwP16VXj_WbRpiIFGIzLTsiROaXth333Wb6mUx9EzcQleW7Q-4C06fylqx0$> 
>>>>
>>> >
>>>> This library loader ends up calling this method which contains a class
>>>> loader check:
>>>> https://github.com/openjdk/jdk/blob/309acbf0e86a0d248294503fccc7a936fa0a846e/src/java.base/share/classes/jdk/internal/loader/NativeLibraries.java#L203 
>>>> <https://urldefense.com/v3/__https://github.com/openjdk/jdk/blob/309acbf0e86a0d248294503fccc7a936fa0a846e/src/java.base/share/classes/jdk/internal/loader/NativeLibraries.java*L203__;Iw!!ACWV5N9M2RV99hQ!bOgtuoBaY3YrzwP16VXj_WbRpiIFGIzLTsiROaXth333Wb6mUx9EzcQleW7Q-4C0tN6Z3Vs$> 
>>>>
>>> >
>>>> I believe this loader check should be guarded by a "isJNI" flag, as we
>>>> did for other checks - e.g. whether JNI_OnLoad should be called.
>>>> Cheers
>>>> Maurizio
>>>> 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 
>>> <https://urldefense.com/v3/__https://github.com/lanthale/JeditFX.git__;!!ACWV5N9M2RV99hQ!bOgtuoBaY3YrzwP16VXj_WbRpiIFGIzLTsiROaXth333Wb6mUx9EzcQleW7Q-4C0nxVq_C0$> 
>>>
>>> >>>>>  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