我正在研究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
文件夹中?
答案 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");
),我们可以解决此问题。