如何解决“java.lang.UnsatisfiedLinkError:无法find依赖库”没有System32?

我正在开发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参数来检查路径。