Search code examples
javalocalizationjava-native-interfacedllimport

UnsatisfiedLinkError if app runs from Japanese folder


I get UnsatisfiedLinkError when trying to reach dll. This happens if bin folder is located in folder with Japanese name, system language and locale are set to Japan. I need to fix this.

In English environment and app located in Japanese named folder app does not run at all (fix unnecessary). In English environment and app located in English named folder app works fine.

Seems like NativeLibrary.load can not handle Japanese characters in library path.

Is this a bug in Java: https://bugs.openjdk.org/browse/JDK-8195129?

Error in console:

Exception in thread "main-FPSAWTAnimator-Timer0" java.lang.UnsatisfiedLinkError: 
F:\Test\テスト\myApp\bin\jre\bin\jpeg.dll: Can't find dependent libraries
        at java.lang.ClassLoader$NativeLibrary.load(Native Method)
        at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941)
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1845)
        at java.lang.Runtime.loadLibrary0(Runtime.java:870)
        at java.lang.System.loadLibrary(System.java:1122)
        at com.sun.imageio.plugins.jpeg.JPEGImageWriter$1.run(JPEGImageWriter.java:180)
        at com.sun.imageio.plugins.jpeg.JPEGImageWriter$1.run(JPEGImageWriter.java:178)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.imageio.plugins.jpeg.JPEGImageWriter.<clinit>(JPEGImageWriter.java:177)
        at com.sun.imageio.plugins.jpeg.JPEGImageWriterSpi.createWriterInstance(JPEGImageWriterSpi.java:96)
        at javax.imageio.spi.ImageWriterSpi.createWriterInstance(ImageWriterSpi.java:351)
        at javax.imageio.ImageIO$ImageWriterIterator.next(ImageIO.java:843)
        at javax.imageio.ImageIO$ImageWriterIterator.next(ImageIO.java:827)
        at sun.awt.datatransfer.DataTransferer.imageToStandardBytesImpl(DataTransferer.java:2203)
        at sun.awt.datatransfer.DataTransferer.imageToStandardBytes(DataTransferer.java:2145)
        at sun.awt.windows.WDataTransferer.imageToPlatformBytes(WDataTransferer.java:352)
        at sun.awt.datatransfer.DataTransferer.translateTransferable(DataTransferer.java:1223)
        at sun.awt.windows.WDataTransferer.translateTransferable(WDataTransferer.java:219)
        at sun.awt.windows.WClipboard.setContentsNative(WClipboard.java:83)
        at sun.awt.datatransfer.SunClipboard.setContents(SunClipboard.java:106)
        at myPath.utils.c.<init>(Unknown Source)
        at myPath.opengl.base.BaseViewer.renderSnapshot(Unknown Source)
        at myPath.opengl.base.BaseViewer.access$1100(Unknown Source)
        at myPath.opengl.base.e.a(Unknown Source)
        at myPath.opengl.base.BaseViewer.render(Unknown Source)
        at myPath.opengl.base.BaseViewer.display(Unknown Source)
        at jogamp.opengl.GLDrawableHelper.displayImpl(GLDrawableHelper.java:665)
        at jogamp.opengl.GLDrawableHelper.display(GLDrawableHelper.java:649)
        at com.jogamp.opengl.swt.GLCanvas$2.run(GLCanvas.java:153)
        at jogamp.opengl.GLDrawableHelper.invokeGLImpl(GLDrawableHelper.java:1119)
        at jogamp.opengl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:994)
        at com.jogamp.opengl.swt.GLCanvas$3.run(GLCanvas.java:165)
        at com.jogamp.opengl.swt.GLCanvas.runInGLThread(GLCanvas.java:970)
        at com.jogamp.opengl.swt.GLCanvas.display(GLCanvas.java:682)
        at com.jogamp.opengl.util.AWTAnimatorImpl.display(AWTAnimatorImpl.java:75)
        at com.jogamp.opengl.util.AnimatorBase.display(AnimatorBase.java:416)
        at com.jogamp.opengl.util.FPSAnimator$MainTask.run(FPSAnimator.java:172)
        at java.util.TimerThread.mainLoop(Timer.java:555)
        at java.util.TimerThread.run(Timer.java:505)

Paths:

  • F:\Test\テスト\myApp\bin\jre\bin\jpeg.dll
  • F:\Test\テスト\myApp\bin\appStarter.exe

console screenshot

Thanks for any hint!


Solution

  • Seems like the answer is here. sybase.allow.native.lib should be allowed:

    System.setProperty("sybase.allow.native.lib", "true");
    

    I need to run proper tests, but for now it seems to work.