如何在没有System32的情况下解决“java.lang.UnsatisfiedLinkError:找不到依赖库”?

时间:2017-03-01 15:58:26

标签: java c++ windows opencv java-native-interface

我正在研究Eclipse上的Java项目,它通过JNI使用C ++ OpenCV库。一些图像处理算法是在本机端使用OpenCV实现的,我希望使用JNI从java中使用它们。

我已经构建了一个链接到Java的C ++ DLL项目,这导致了一个MyLibrary.dll文件。我使用GCC 6.3编译器编译了OpenCV,并在Eclipse CDT上使用相同的GCC 6.3编译器编译了C ++代码(以及MinGW Linker)。我还使用Dependency Walker检查了是否存在任何依赖性问题。到目前为止我没有任何错误。

之后,我尝试从Java代码加载库,如下所示:
System.loadLibrary("MyLibrary")

我已使用-Djava.library.path=path\to\MyLibrary设置路径,并确保JVM知道本机库的地址。我还在MyLibrary.dll旁边添加了所需的OpenCV库。

但是我收到以下错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: MyLibrary.dll: Can't find dependent libraries
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(Unknown Source)
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
...

当我将依赖的OpenCV库移动到System32文件夹时,问题就消失了。

我的问题是;如何解决此问题而不将所需的DLL文件移动到System32文件夹中?

2 个答案:

答案 0 :(得分:3)

此问题的最佳做法是通过调用库加载方法自行加载依赖库:

System.loadLibrary("opencv_1");
System.loadLibrary("opencv_2");
...

现在加载依赖库后,您可以使用相同的方式安全地加载自己的dll文件:

System.loadLibrary("MyFile");

这应解决can't file dependent libraries错误。

另一种解决方法(没有最佳做法)是将依赖的dll文件(在您的情况下为opencv dll)复制到System32文件夹。

为什么会这样?

我认为,当你设置java.library.path参数时,你负责加载库的依赖库,而不是操作系统本身。我不确定是否诚实。

How to fix an UnsatisfiedLinkError (Can't find dependent libraries) in a JNI project中所述 ,您可以通过向虚拟机添加-XshowSettings:properties -version参数来检查路径。

答案 1 :(得分:1)

对于遇到投诉的人:Can't find dependent libraries,并访问此帖子以寻求解决方案:

此投诉表示无法加载的dll取决于其他一些dll。通过使用智能步行者http://www.dependencywalker.com/,我们可以知道需要哪些dll。通过在加载失败的dll之前加载它们(System.loadLibrary("dependedDll");),我们可以解决此问题。