在 java 中用 System.loadLibrary() 加载的 .dll 的搜索路径是什么?
What becomes the search path of a .dll loaded with System.loadLibrary() in java?
我有一个系统,其中有 1 个 .exe 文件、4 个 .dll 文件和一个 jar 文件,其中的依赖项如下所示:
A.exe -> 调用 -> B.dll -> 通过 JNI 调用 -> C.jar -> 使用 System.loadLibrary("") 加载 -> D.dll -> 调用 E.dll
现在,B 到 E 是一个模块,所有这些文件都在同一目录中。 A.exe 是一个放置在不同目录中的应用程序,它可以使用其中的几个模块。
我的主要问题是,当 D.dll 尝试加载 E.dll 时,我得到一个 '找不到依赖库'java.lang.UnsatisfiedLinkError。如果我站在模块目录下,手动 运行 C.jar 就没有这样的错误 D.dll 设法加载 E.dll 就好了。
所以,我的主要问题是:AddDllDirectory(%moduleDir%) 是 A.exe[=54= 中的 运行 ],但它实际上有多远'inherited'? C.jar 是否以某种方式删除了此函数添加的目录?有没有办法在 System.loadLibrary("") 调用之前从 java 扩展 dll 搜索路径,以便加载的 .dll 继承此搜索路径?
- java.library.path设置为B.dll通过JNI启动JVM时的模块目录
- 我想避免 A.exe 改变 PATH 环境变量
- D.dll 或 E.dll
无需更改
提前感谢您的回答
这里是对您的案例中发生的错误的简短解释。
假设如下
- Java 调用
System.loadLibrary("D");
class 在目录 APP_DIR 中
D.dll
取决于 E.dll
,都在目录 DLL_DIR 中
案例 1java.library.path
未指定
no D in java.library.path
案例 2 -Djava.library.path=%DLL_DIR%
D.dll: Can't find dependent libraries
因为 Java 检查 %DLL_DIR%
中是否存在 D.dll
加载库(使用 Windows LoadLibrary 功能)。 Windows 尝试查找在 PATH
和当前目录中找不到的相关 E.dll
。
案例 3 -Djava.library.path=%DLL_DIR%
和 set PATH=%DLL_DIR%;%PATH%
System.loadLibrary("D"); will be successful
关于此主题的一些附加链接
我有一个系统,其中有 1 个 .exe 文件、4 个 .dll 文件和一个 jar 文件,其中的依赖项如下所示:
A.exe -> 调用 -> B.dll -> 通过 JNI 调用 -> C.jar -> 使用 System.loadLibrary("") 加载 -> D.dll -> 调用 E.dll
现在,B 到 E 是一个模块,所有这些文件都在同一目录中。 A.exe 是一个放置在不同目录中的应用程序,它可以使用其中的几个模块。
我的主要问题是,当 D.dll 尝试加载 E.dll 时,我得到一个 '找不到依赖库'java.lang.UnsatisfiedLinkError。如果我站在模块目录下,手动 运行 C.jar 就没有这样的错误 D.dll 设法加载 E.dll 就好了。
所以,我的主要问题是:AddDllDirectory(%moduleDir%) 是 A.exe[=54= 中的 运行 ],但它实际上有多远'inherited'? C.jar 是否以某种方式删除了此函数添加的目录?有没有办法在 System.loadLibrary("") 调用之前从 java 扩展 dll 搜索路径,以便加载的 .dll 继承此搜索路径?
- java.library.path设置为B.dll通过JNI启动JVM时的模块目录
- 我想避免 A.exe 改变 PATH 环境变量
- D.dll 或 E.dll 无需更改
提前感谢您的回答
这里是对您的案例中发生的错误的简短解释。
假设如下
- Java 调用
System.loadLibrary("D");
class 在目录 APP_DIR 中
D.dll
取决于E.dll
,都在目录 DLL_DIR 中
案例 1java.library.path
未指定
no D in java.library.path
案例 2 -Djava.library.path=%DLL_DIR%
D.dll: Can't find dependent libraries
因为 Java 检查 %DLL_DIR%
中是否存在 D.dll
加载库(使用 Windows LoadLibrary 功能)。 Windows 尝试查找在 PATH
和当前目录中找不到的相关 E.dll
。
案例 3 -Djava.library.path=%DLL_DIR%
和 set PATH=%DLL_DIR%;%PATH%
System.loadLibrary("D"); will be successful
关于此主题的一些附加链接