在java中用System.loadLibrary()加载的.dll的搜索路径是什么?

我有一个系统,其中有1个.exe文件,4个.dll文件和一个jar文件,其依赖关系如下所示:

A.exe - >调用 - > B.dll - >通过JNI调用 - > C.jar - >加载System.loadLibrary(“”) - > D.dll - >调用E.dll

现在, BE是一个模块,所有这些文件都在同一个目录中。 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继承此搜索路径?

  • B.dll通过JNI启动JVM时,java.library.path被设置为模块目录
  • 我想避免使A.exe改变PATH环境变量
  • D.dllE.dll中没有必要进行更改
  • 预先感谢任何答案


    这里对你的情况中发生的错误做一个简短的解释。

    假设如下

  • Java调用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
    

    关于此主题的一些其他链接

  • MSDN“动态链接库搜索顺序”
  • MSDN AddDllDirectory函数
  • MSDN SetDllDirectory函数
  • SetDllDirectory继承问题
  • 链接地址: http://www.djcxy.com/p/44501.html

    上一篇: What becomes the search path of a .dll loaded with System.loadLibrary() in java?

    下一篇: How to remove unused methods in C#?