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

问题描述 投票:0回答:5

我正在 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文件夹中?

    

java c++ windows opencv java-native-interface
5个回答
6
投票

System.loadLibrary("opencv_1"); System.loadLibrary("opencv_2"); ...

现在加载依赖库后,您可以使用相同的方式安全地加载自己的 dll 文件:

System.loadLibrary("MyFile");

这应该可以解决 
can't file dependent libraries

错误。


另一种解决方法(不是最佳实践)是将依赖的 dll 文件(在您的情况下是 opencv dll)复制到 System32 文件夹。

为什么会出现这种情况?

我认为,当您设置

java.library.path

参数时,您负责加载库的依赖库,而不是操作系统本身。我不确定是否诚实。


如何修复 JNI 项目中的 UnsatisfiedLinkError(找不到依赖库)

中所述 ,您可以通过向虚拟机添加 -XshowSettings:properties -version 参数来检查您的路径。

    


3
投票
Can't find dependent libraries

并访问此帖子寻求解决方案:


这个抱怨意味着加载失败的dll依赖于其他一些dll。通过使用依赖遍历器:

http://www.dependencywalker.com/

,我们可以知道需要哪些 dll。通过在加载dll失败之前加载它们(System.loadLibrary("dependedDll");),我们可以解决这个问题。

    


2
投票

https://www.mail-archive.com/

[电子邮件受保护]/msg22016.html “如前所述,安装了 Visual C++ 2019 可再发行组件的计算机上不会引发上述异常。”

我下载了 2015-2019 年的 MS Visual C++ 可再发行组件,并将其安装在两台不同的计算机上,并使用 offAdoptJDK、jre_8u_202 和 jre_8u_265 的差异组合,这解决了我的问题。

我从以下链接下载了可再发行版本:

https://support.microsoft.com/en-us/topic/the-latest-supported-visual-c-downloads-2647da03-1eea-4433-9aff-95f26a218cc0

对于 Windows 10,我安装了上面的“x64: vc_redist.x64.exe”来解决我的问题。


0
投票

dependency walker 并发现在加载我的 dll 之前我需要先加载 opencv_world455.dll

    


0
投票

使用 g++ (MinGW) 编译 Java JNI,包括依赖 dll:

g++ -c -I"C:\Program Files\Eclipse Adoptium\jdk-17.0.2.8-hotspot\include" -I"C:\Program Files\Eclipse Adoptium\jdk-17.0.2.8-hotspot\include\win32" UtilLib.cpp -o UtilLib.o g++ -shared -o UtilLib.dll UtilLib.o -static-libgcc -static-libstdc++ -Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive

© www.soinside.com 2019 - 2024. All rights reserved.