-
Notifications
You must be signed in to change notification settings - Fork 743
Debugging UnsatisfiedLinkError on Windows
On most platforms, including Android, Linux, and Mac OS X, when the operating system cannot load a library, it provides useful information to resolve easily the loading issue. For example, if we try to use the JavaCPP Presets for FlyCapture on Linux without having actually installed the library for FlyCapture, we get thrown the following exception:
java.lang.UnsatisfiedLinkError: no jniFlyCapture2 in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1864)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1122)
at org.bytedeco.javacpp.Loader.loadLibrary(Loader.java:636)
at org.bytedeco.javacpp.Loader.load(Loader.java:474)
at org.bytedeco.javacpp.Loader.load(Loader.java:411)
at org.bytedeco.javacpp.FlyCapture2.<clinit>(FlyCapture2.java:10)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.bytedeco.javacpp.Loader.load(Loader.java:446)
at org.bytedeco.javacpp.Loader.load(Loader.java:411)
at org.bytedeco.javacpp.FlyCapture2$FC2Version.<clinit>(FlyCapture2.java:709)
at FlyCapture2Test.PrintBuildInfo(FlyCapture2Test.java:28)
at FlyCapture2Test.main(FlyCapture2Test.java:135)
... 6 more
Caused by: java.lang.UnsatisfiedLinkError: /tmp/javacpp3216546462129/libjniFlyCapture2.so: libflycapture.so.2: cannot open shared object file: No such file or directory
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1938)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1821)
at java.lang.Runtime.load0(Runtime.java:809)
at java.lang.System.load(System.java:1086)
at org.bytedeco.javacpp.Loader.loadLibrary(Loader.java:619)
... 16 more
Unfortunately, Windows is not as cooperative: The case of the DLL that refuses to load
Nevertheless, there is a way to obtain the same kind of information almost as easily on Windows using Dependencies.
Here is the neat trick:
-
Download the latest version of Dependencies for x64, extract it somewhere, and
-
Call the following at the beginning of the
main()
method or during initialization somewhere:try { Loader.load(<module>.class); } catch (UnsatisfiedLinkError e) { String path = Loader.cacheResource(<module>.class, "windows-x86_64/jni<module>.dll").getPath(); new ProcessBuilder("c:/path/to/DependenciesGui.exe", path).start().waitFor(); }
∗ Replace <module>
with the JavaCPP Presets module that is having problems loading, for example, opencv_core
.
After which please feel free to file an issue as appropriate along with the information you obtained from Dependencies.