我有一个系统,我有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 中运行,但它实际得到了多少'继承'? C.jar 以某种方式删除此功能添加的目录吗?有没有办法在 System.loadLibrary(“”)调用之前从java扩展dll搜索路径,以便加载的.dll继承此搜索路径?
提前感谢您的回答
答案 0 :(得分:2)
这是对您的案例中出现的错误的简短说明。
假设以下
System.loadLibrary("D");
该类位于目录APP_DIR D.dll
取决于目录DLL_DIR E.dll
案例1 java.library.path
未指定
no D in java.library.path
案例2 -Djava.library.path=%DLL_DIR%
D.dll: Can't find dependent libraries
因为Java检查D.dll
中是否存在%DLL_DIR%
加载库(使用Windows LoadLibrary功能)。 Windows尝试查找在E.dll
中找不到但不在当前目录中的从属PATH
。
案例3 -Djava.library.path=%DLL_DIR%
和set PATH=%DLL_DIR%;%PATH%
System.loadLibrary("D"); will be successful
关于此主题的一些其他链接