java - 如何解决 "java.lang.UnsatisfiedLinkError: Can' t find dependent libraries"without System32?

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

我正在 Eclipse 上开发一个 Java 项目,它通过 JNI 使用 C++ OpenCV 库。一些图像处理算法在 native 端使用 OpenCV 实现,我希望使用 JNI 从 java 中使用它们。

我已经构建了一个 C++ DLL 项目来链接到 Java,这导致了一个 MyLibrary.dll 文件。我使用 GCC 6.3 编译器编译了 OpenCV,并在 Eclipse CDT 上使用相同的 GCC 6.3 编译器(以及 MinGW 链接器)编译了 C++ 代码。我还使用 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 文件夹中来解决这个问题?

最佳答案

这个问题最好的做法是调用library load方法自行加载依赖库:

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 参数来检查您的路径。

关于java - 如何解决 "java.lang.UnsatisfiedLinkError: Can' t find dependent libraries"without System32?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42536366/

相关文章:

Java DOM 如何检查节点是否存在于 XML 中

c++ - 强制 C++ 函数的用户承认作为数值常量的参数的语义含义的最佳方法是什么?

C++/cli 将 LPCSTR 转换为 System::String^

c# - 通过 Managed Wifi API 进行 WLAN 管理

php - 如何使用 OpenOffice 从我的 PHP 网页将 RTF 转换为 PDF?

java - Spring Autowire 检索错误的类

java - getInputStream 卡住并且永远不会完成

java - Spark : Two SparkContexts in a single Application Best Practice

c++ - 如何使 g++ 导致异常而不是警告格式错误

java - 将具有自定义目录结构的 Java 程序作为 Windows 服务运行