在java中用System.loadLibrary()加载的.dll的搜索路径是什么?
我有一个系统,其中有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继承此搜索路径?
预先感谢任何答案
这里对你的情况中发生的错误做一个简短的解释。
假设如下
System.loadLibrary("D");
该类位于目录APP_DIR中 D.dll
取决于E.dll
,无论是在目录DLL_DIR 情况1没有指定java.library.path
no D in java.library.path
情况2 -Djava.library.path=%DLL_DIR%
D.dll: Can't find dependent libraries
由于Java在%DLL_DIR%
加载库(使用Windows LoadLibrary功能)中检查是否存在D.dll
。 Windows会尝试查找在PATH
找不到的相关E.dll
,而不是在当前目录中。
情况3 -Djava.library.path=%DLL_DIR%
并set PATH=%DLL_DIR%;%PATH%
System.loadLibrary("D"); will be successful
关于此主题的一些其他链接
上一篇: What becomes the search path of a .dll loaded with System.loadLibrary() in java?