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

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

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

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

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

我的主要问题是,当 D.dll 尝试加载 E.dll 时,我得到一个“找不到相关库”java.lang。不满意的链接错误。如果我站在模块目录中并手动运行 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
  4. 无需更改

提前感谢任何答案

最佳答案

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

假设如下

  • 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% 中是否存在 D.dll 加载库(使用 Windows LoadLibrary 功能)。 Windows 尝试查找在 PATH 和当前目录中找不到的相关 E.dll

案例 3 -Djava.library.path=%DLL_DIR% and set PATH=%DLL_DIR%;%PATH%

System.loadLibrary("D"); will be successful

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

关于java - 在 java 中用 System.loadLibrary() 加载的 .dll 的搜索路径是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32475839/

相关文章:

java - 从 Java 中使用 C 接口(interface)调用 DLL

c# - LabView 应用程序中引用的 C# .dll 是否可以访问 app.config 文件?

java - Spring MVC IllegalStateException 错误

java - 错误: unreported exception JSONException in Android

java - 如何从非 Activity 类中删除 FusedlocationProviderClient 位置更新

用于隐式类型转换的 C++ 构造函数

c++ - 使用 Boost::spirit 编写的解析器的性能问题

java - shell脚本从crontab调用,但脚本中的结束任务没有被执行,但手动它可以工作

c++ - 奇怪的代码错误

c# - pinvoke 期间未将第二个值传递给 C++ 函数