用java中的System.loadLibrary()加载的.dll的搜索路径

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

本文关键字:加载 dll 搜索 路径 java 中的 System loadLibrary      更新时间:2023-10-16

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

A.exe->调用->B.dll->通过JNIC.jar->调用System.loadLibrary("(->D.dll->调用E.dll

现在,BE是一个模块,所有这些文件都在同一目录中A.exe是一个放置在不同目录中的应用程序,可以使用其中的几个模块。

我的主要问题是,当D.dll尝试加载E.dll时,我得到一个">找不到依赖库"java.lang.UnsaisfiedLinkError。如果我站在模块目录中手动运行C.jar,则不会出现这样的错误,并且D.dll能够加载E.dll

因此,我的主要问题是:AddDllDirectory(%moduleDir%(A.exe中运行,但它实际"继承"了多远?C.jar是否以某种方式删除了此函数添加的目录?在调用System.loadLibrary("(之前,是否有办法从java扩展dll搜索路径,以便加载的.dll继承此搜索路径?

  1. java.library.path设置为B.dll通过JNI启动JVM时的模块目录
  2. 我希望避免A.exe更改PATH环境变量
  3. D.dllE.dll

提前感谢您的任何回答

这里是对您的案例中发生的错误的简短解释。

假设如下

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

关于这个主题的一些附加链接

  • MSDN"动态链接库搜索顺序">
  • MSDN AddDllDirectory函数
  • MSDN SetDllDirectory函数
  • SetDllDirectory继承问题