当前位置: 首页 > 知识库问答 >
问题:

如何解决"java.lang.未满足链接错误:无法找到依赖库"没有System32?

蒲功
2023-03-14

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

我构建了一个C DLL项目来链接到Java,这导致了一个MyLibrary.dll文件。我使用GCC 6.3编译器编译了OpenCV,并在Eclipse CDT上使用相同的GCC 6.3编译器编译了C代码(以及MinGW链接器)。我还使用Dependency Walker检查了是否有任何依赖问题。到目前为止我没有错误。

之后,我尝试从Java代码加载库,如下所示:
系统。loadLibrary(“MyLibrary”)

我已经用Djava设置了路径。图书馆path=path\to\MyLibrary,并确保JVM知道本机库的地址。我还在MyLibrary旁边添加了所需的OpenCV库。dll。

但是,我得到以下错误:

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文件夹的情况下解决此问题?

共有3个答案

沈淇
2023-03-14

在遇到此错误报告后,我解决了此问题:

https://www.mail-archive.com/openjfx-dev@openjdk.java.net/msg22016.html

“如前所述,安装了Visual C 2019 redistributable的计算机不会引发上述异常。”

我下载了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\u redist.x64.exe”来解决我的问题。

郎永福
2023-03-14

对于遇到投诉的用户:找不到相关库,请访问此帖子以寻求解决方案:

此投诉意味着加载失败的dll依赖于其他dll。使用Dependency walker:http://www.dependencywalker.com/,我们可以知道需要哪些DLL。通过加载它们(System.loadLibrary(“dependedDll”)

宋鸿德
2023-03-14

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

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

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

System.loadLibrary("MyFile");

这应该可以解决不能文件依赖库错误。

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

为什么会这样?

我想,当你设置java时。图书馆path参数,您负责加载库的依赖库,而不是操作系统本身。我不确定是否诚实。

正如如何修复JNI项目中的UnecifiedLinkError(无法找到依赖库)中提到的,您可以通过向虚拟机添加-Xshow Setting: Properties-version参数来检查您的路径。

 类似资料:
  • 我试图编写一个简单的Java程序,通过JNI调用C函数来打印“Hello World”。一切编译都没有错误,但当我运行程序时,我得到一个“UnsatisfiedLinkError:找不到依赖库”。 根据Dependency Walker和dumpbin的说法,唯一的依赖项是“kernel32.dll”,在C:\Windows\System32及其依赖项中,也在System32中。 使命感 返回时没

  • 我试图从java调用一个使用C样式字符串的C函数。当我使用C风格的字符串时,程序执行得很好,但正如我声明std::string时,不知何故,它再也找不到依赖库了。我在eclipse环境中检查了includes文件夹,它确实包含 这是我的本地文件: 这段代码可以很好地从java编译并运行良好,但只要我尝试使用std::string版本(注释),代码就会编译并创建动态库,但在运行java代码时,我会遇

  • 我正在尝试弄清楚如何将我的本机库集成到android代码中。我创建了一个简单的C函数,它在设备上运行代码时运行良好。但是我目前的目标是让它在单元测试环境(jUnit)中工作,我面临着问题: 因此,在单元测试env不工作,我将其保存到系统中。load(“/full/path/to/lib.so”),但现在此行引发异常: java.lang.不满意的链接错误:app\build\中介\cmake\de

  • 我正在从事一个使用JNI的Java项目。JNI调用我自己编写的自定义库,比如mylib。这取决于第三方库libsndfile-1。dll。 当我运行我的程序时,它会崩溃 我搜索了这个网站(和其他网站),并尝试了一些修复: > 我修复了mylib中的方法名称。dll,如此处所建议。方法名称不知怎么被编译器弄乱了,但我添加了链接器标志,dll方法名称现在与jni头文件中的名称完全匹配。 我将所有这些D

  • 为什么我会得到不满意的链接错误? 细节如下: 本机方法的原型及其在我的Java代码中的调用是这样的: 私有本机long sampleFunction(long[][]twoDimArray,long number); p.SampleFunction(twoDimArray,number); 本机方法在VC++代码中的原型是这样的: JNIEXPORT jlong JNICALL Java_MyC

  • 我正在使用Sikuli脚本运行Testng,它在Eclipse ide中运行良好。在Eclipse IDE中,我使用Java1.7.0版本。 但是当我创建一个Ant脚本时,它抛出了一个异常。当我与ant-v核实时 Apache Ant version 1.7.1编译于2010年9月8日Buildfile:build.xml检测到Java版本: 1.6--- 初始化:[echo]开始。时间 构建: