如何在JNI项目中修复UnsatisfiedLinkError(无法找到依赖库)

如何在JNI项目中修复UnsatisfiedLinkError(无法找到依赖库)

我正在开发一个使用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中进行开发。我正在使用toshiba笔记本电脑在Windows XP上进行测试。


斯蒂芬大帝
浏览 379回答 3
3回答

慕码人2483693

我很确定classpath和共享库搜索路径彼此之间几乎没有关系。根据JNI Book(不可否认,旧版),如果您不使用java.library.path系统属性,则在Windows上,DLL需要位于当前工作目录或Windows PATH环境变量中列出的目录中。更新:看起来Oracle已从其网站上删除了PDF。我已经更新了上面的链接,指向生活在德克萨斯大学阿灵顿分校的PDF实例。此外,您还可以阅读Oracle的JNI规范的HTML版本。它存在于Java网站的Java 8部分中,因此希望能够存在一段时间。更新2:至少在Java 8中(我没有检查过早期版本)你可以这样做:java -XshowSettings:properties -version找到共享库搜索路径。java.library.path在该输出中查找属性的值。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java