什么成为java中加载System.loadLibrary()的.dll的搜索路径?

时间:2015-09-09 09:28:02

标签: java c++ dll java-native-interface loadlibrary

我有一个系统,我有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继承此搜索路径?

  1. B.dll 通过JNI启动JVM时,java.library.path设置为模块目录
  2. 我想避免 A.exe 更改PATH环境变量
  3. D.dll E.dll
  4. 不需要进行任何更改

    提前感谢您的回答

1 个答案:

答案 0 :(得分:2)

这是对您的案例中出现的错误的简短说明。

假设以下

  • 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检查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

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