【发布时间】:2011-08-30 20:03:48
【问题描述】:
我正在开发一个使用 JNI 的 Java 项目。 JNI 调用我自己编写的自定义库,比如说 mylib.dll,它依赖于第 3 方库 libsndfile-1.dll。
当我运行我的程序时它崩溃了
java.lang.UnsatisfiedLinkError: C:\...path...\mylib.dll: Can't find dependent libraries.
我已经搜索了这个网站(和其他网站)并尝试了一些修复方法:
我运行了依赖walker。 DW 给出了一些警告——libsndfile 所需的两个库 MPR.DLL 和 SHLWAPI.DLL 有“未解析的导入”——但 DW FAQ 表示可以安全地忽略这些警告。
按照here 的建议,我修复了 mylib.dll 中的方法名称。方法名称不知何故被编译器弄乱了,但我添加了链接器标志,现在 dll 方法名称与我的 jni 头文件中的名称完全匹配。
我将所有这些 DLL 放在同一个目录中 - 与调用它们的 .jar 相同的目录 - 以确保它们位于正确的 PATH 上。
没有骰子。
有人知道发生了什么吗?
我正在 MacBook Pro 上(通过 Parallels)在 Visual Studio 2010 中进行开发。我正在东芝笔记本电脑上的 Windows XP 中进行测试。
【问题讨论】:
-
你设置 -Djava.library.path 了吗?
-
实际上我没有,因为我没有从命令行启动程序。我正在为 Processing (processing.org) 编写一个库,而 Processing 负责启动我的代码。不过,我在运行时检查了 java 库路径,包含我的 DLL 的文件夹就在上面。
-
在 Windows 上,我们必须将 .dll 文件放在 [JRE]\bin 目录中(与 java.exe 等相同的位置),以便让 Java 自动查看它们而不必弄脏使用命令行选项或环境变量。
-
嗯...好的,我尝试将所有 .dll 文件放入 [JRE]\bin 中。这行得通!
-
查看
.在您的PATH中相对于其他目录(JRE、Windows 等)的位置。较早的条目之一可能提供了与您尝试从当前目录加载的库不兼容的库版本。在我的 PATH 中移动.对我有用,并且让我不必用我的库污染 JRE 目录。
标签: java windows-xp java-native-interface libsndfile