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

新手上路,请多包涵

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

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

原文由 Utku Ufuk 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 667
1 个回答

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

 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 finddependent libraries) in a JNI project 中所述,您可以通过向虚拟机添加 -XshowSettings:properties -version 参数来检查您的路径。

原文由 isacikgoz 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题