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

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

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

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

我已经搜索了这个网站(和其他网站),我尝试了许多修复程序:

  1. 我跑了依赖步行者。DW给出了一些警告 - libsndfile所需的两个库,MPR.DLL和SHLWAPI.DLL,有“未解决的导入” - 但DW FAQ说这些警告可以安全地忽略。

  2. 我修复了 mylib.dll 中的方法名称,如此处所示。方法名称以某种方式被编译器破坏了,但我添加了链接器标志,dll方法名称现在与我的jni头文件中的那些名称完全匹配。

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

没有骰子。

有没有人知道发生了什么?

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


答案 1

我很确定类路径和共享库搜索路径彼此之间几乎没有关系。根据 JNI Book(诚然,这是旧的),在 Windows 上,如果您不使用系统属性,则 DLL 需要位于当前工作目录中或 Windows 环境变量中列出的目录中。java.library.pathPATH


更新:

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

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


更新 2:

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

java -XshowSettings:properties -version

以查找共享库搜索路径。在该输出中查找属性的值。java.library.path


答案 2

我想告知这个有趣的案例,在尝试了上述所有方法后,错误仍然存在。奇怪的是,它适用于Windows 7计算机,但在Windows XP上则不然。然后我使用依赖步行者,发现在Windows XP上没有VC ++ 运行时作为我的dll要求。在这里安装VC ++ 运行时包后,它就像一个魅力。让我感到不安的是,它一直告诉找不到依赖库,而直观地说,JNI依赖的dll就在那里,但是最终证明JNI依赖的dll需要另一个依赖的dl。我希望这有帮助。


推荐