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

如何修复JNI项目中的未满足链接错误(找不到依赖库)

堵德曜
2023-03-14

我正在从事一个使用JNI的Java项目。JNI调用我自己编写的自定义库,比如mylib。这取决于第三方库libsndfile-1。dll。

当我运行我的程序时,它会崩溃

java.lang.UnsatisfiedLinkError:  C:\...path...\mylib.dll: Can't find dependent libraries.

我搜索了这个网站(和其他网站),并尝试了一些修复:

>

我修复了mylib中的方法名称。dll,如此处所建议。方法名称不知怎么被编译器弄乱了,但我添加了链接器标志,dll方法名称现在与jni头文件中的名称完全匹配。

我将所有这些DLL放在同一个目录中--与的目录相同。jar调用它们,以确保它们位于正确的路径上。

没有骰子。

有人知道发生了什么事吗?

我正在Visual Studio 2010中的MacBook pro上进行开发(通过Parallels)。我正在东芝笔记本电脑上用Windows XP进行测试。

共有3个答案

壤驷敏学
2023-03-14

您需要加载JNI库。

System.load库从JVM路径(JDK bin路径)加载DLL。

如果要加载具有路径的显式文件,请使用System。加载()

另请参见:系统之间的差异。load()和系统。Java中的loadLibrary

段干英杰
2023-03-14

我想告知这个有趣的案例,在尝试了以上所有方法之后,错误仍然存在。奇怪的是,它在Windows 7计算机上工作,但在Windows XP上却不工作。然后我使用dependency walker,发现在Windows XP上没有VC运行时作为我的dll要求。在这里安装VC Runtime包后,它的工作非常有魅力。让我不安的是,它一直告诉我找不到依赖的库,而直观地看,依赖JNI的dll就在那里,但最终发现依赖JNI的dll需要另一个依赖的dl。我希望这有帮助。

万俟旭
2023-03-14

我很确定类路径和共享库搜索路径之间没有什么关系。根据JNI的书(公认是很旧的),如果不使用java,就可以在Windows上运行。图书馆path属性,DLL需要位于当前工作目录或Windows环境变量中列出的目录中。

更新:

看起来Oracle已经从其网站上删除了PDF。我已经更新了上面的链接,以指向德克萨斯大学阿灵顿分校的PDF实例。

此外,您还可以阅读Oracle的HTML版本的JNI规范。它位于Java网站的Java 8部分,因此希望能存在一段时间。

更新2:

至少在Java8(我没有检查早期版本)你可以做到:

java -XshowSettings:properties -version

查找共享库搜索路径。查找java的值。图书馆该输出中的path属性。

 类似资料:
  • 我试图编写一个简单的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代码时,我会遇

  • 问题内容: 我正在使用JNI的Java项目中。JNI调用了一个我自己编写的自定义库,比方说mylib.dll,它依赖于一个第三方库libsndfile-1.dll。 当我运行程序时,它崩溃 我搜索了该网站(和其他网站),并尝试了许多修复程序: 我跑了依赖沃克。DW发出了一些警告-libsndfile所需的两个库MPR.DLL和SHLWAPI.DLL具有“未解决的导入”-但DW FAQ表示可以安全地

  • 我有一个JNI dll以及我在带有eclipse的机器上创建的jar文件。 我正在尝试将其部署到另一台机器,但无法通过异常 我有另一个打印java.library.path的程序,我已经验证了这个dll所依赖的dll以及这个dll在java.library.path. 我已经阅读了他们应该在当前目录中的帖子,但这不起作用。 我读过他们应该去jre/bin的帖子,得到了同样的结果。 任何帮助都将不胜

  • 我正在Eclipse上从事一个Java项目,该项目通过JNI使用C OpenCV库。一些图像处理算法是在本机端用OpenCV实现的,我希望使用JNI从java使用它们。 我构建了一个C DLL项目来链接到Java,这导致了一个文件。我使用GCC 6.3编译器编译了OpenCV,并在Eclipse CDT上使用相同的GCC 6.3编译器编译了C代码(以及MinGW链接器)。我还使用Dependenc

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