10

长话短说:我有一个可执行的 jar,它调用jni.dll依赖于lib.dll. 我越来越害怕了UnsatisfiedLinkError

根据我的经验,这个答案非常接近,但无法解决问题。即使在 中指定了 dll 所在的文件夹java.library.path,它也不起作用。我还必须更改 WindowsPATH环境变量。事实上,java.library.pathWindows 上的默认设置似乎是PATH.

有什么“漂亮”的方法来解决这个问题吗?我想为 Windows 构建一个安装程序,我想知道如何处理这个问题,这样最终用户就不必做任何手动工作。

编辑:

我实现的内容如下:该应用程序附带一个名为“native_libs”的文件夹,其中包含所有受支持架构的动态库。结构如下:

/
+- native_libs/
   +- windows/
   |  +- x86/
   |  |  +- ...
   |  +- x64/
   |     +- ...
   |
   +- linux/
   |  +- x86/
   |  |  +- ...
   |  +- x64/
   |     +- ...
   |
   +- libs/
      +- ...

在运行时,当应用程序初始化时,会检测到正确的 JRE 架构和系统操作系统,并将正确的库文件复制到 libs/ 文件夹中。java.library.path也正在运行时设置以及使用常见的 hack 。最后,PATH使用本机启动器设置 Windows 的环境变量。

有改进的余地吗?也许将dll复制到与文件相同的目录中jar会消除设置java.library.pathPATH变量的需要?我还需要调查加载 dll System.load(),这将消除复制文件的需要。

4

4 回答 4

12

java.library.path指定System.loadLibrary()查找动态库文件的目录。如果您更改java.library.path代码中的系统属性,则不会产生任何影响。有一些技巧可以让 Java “忘记”初始值并重新评估java.library.path系统属性的内容。

但是,依赖库不是由 Java 加载的,而是由 Windows 加载的。Windows 不关心java.library.path,它只关心PATH环境变量。您唯一的选择是PATH针对您的 Java 进程进行调整。例如,如果您从批处理文件启动它,请PATH在调用 java 之前更改环境变量。

于 2012-09-24T14:23:21.733 回答
1

最简单的解决方案是确保所有 .dll 都在 '.' 中。当你执行。

于 2012-09-25T01:52:21.547 回答
0

将您的 jni.dll 依赖的 dll 放在您的“当前工作目录”中,System.getProperty("user.dir")在运行时检查它以了解您的“当前工作目录”是什么

于 2014-01-25T17:53:03.053 回答
0

如果问题是操作系统找不到依赖库,您是否尝试System.loadLibrary()在加载主库​​之前通过加载它?

于 2012-09-24T16:52:49.967 回答