【发布时间】:2015-09-09 09:28:01
【问题描述】:
我有一个系统,我有 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。不满意的链接错误。如果我站在模块目录中并手动运行 C.jar 则没有此类错误并且 D.dll 设法加载 E.dll很好。
所以,我的主要问题是:AddDllDirectory(%moduleDir%) 在 A.exe 中运行,但它实际上“继承”了多远? C.jar 是否会以某种方式删除此函数添加的目录?有没有办法在 System.loadLibrary("") 调用之前从 java 扩展 dll 搜索路径,以便加载的 .dll 继承此搜索路径?
- java.library.path设置为B.dll通过JNI启动JVM时的模块目录
- 我想避免 A.exe 更改 PATH 环境变量
- D.dll 或 E.dll 无需更改
提前感谢您的任何回答
【问题讨论】:
-
当您的系统库
D.dll尝试加载系统库E.dll时,为什么会出现Java 异常java.lang.UnsatisfiedLinkError。异常消息的措辞是什么?是D.dll: %1 is not a valid Win32 application还是no D in java.library.path? -
这是错误消息:
java.lang.UnsatisfiedLinkError: <moduleDir>\D.dll: Can't find dependent libraries这里发生的情况是,在 java 中,当System.loadLibrary("D.dll")执行时,它会失败,因为它找不到 E.dll 其中 D.dll 依赖于
标签: java c++ dll java-native-interface loadlibrary