我正在开发Eclipse上的Java项目,通过JNI使用C ++ OpenCV库。 一些image processingalgorithm是在本机端用OpenCV实现的,我希望从JNI中使用它们。
我build立了一个C ++ DLL项目来链接到Java,这导致了一个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
设置path,并确保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
文件夹?
此问题的最佳实践是调用库加载方法自行加载相关库:
System.loadLibrary("opencv_1"); System.loadLibrary("opencv_2"); ...
现在您加载相关的libararies后,可以用同样的方法安全地加载自己的dll文件:
System.loadLibrary("MyFile");
这应该解决can't file dependent libraries
错误。
另一个解决方法(没有最佳实践)是将依赖的dll文件(在你的情况下opencv DLL)复制到System32文件夹。
为什么发生这种情况?
我想,当你设置java.library.path
参数时,你有责任加载库的依赖库,而不是操作系统本身。 我不确定是否诚实。
正如在JNI项目中如何解决UnsatisfiedLinkError(无法找到依赖库)中所述 ,您可以通过向虚拟机添加-XshowSettings:properties -version
参数来检查路径。