假设我有 JNI.dll
.这取决于 native.dll
.现在我的 Java 应用程序调用 System.loadLibrary("JNI")
.
以下文件夹布局是否可行?
MainFolder
|--main.exe
|--SubFolder
|--JNI.dll
|--native.dll
我的猜测是,有2 级 依赖项解析。
[级别 1]:
System.loadLibrary("JNI")
使用 JVM 属性 java.library.path
定位JNI.dll
.
[级别 2]:
JNI.dll
依赖Windows系统机制定位native.dll
.
这是正确的吗?
如果我设置 %_JAVA_OPTIONS%
作为-Djava.library.path=MainFolder\SubFolder
,我认为它可以覆盖搜索 JNI.dll
. 但它会覆盖对native.dll
的搜索吗? ,也是吗?
加1
看来我对 2 级的猜测从这里得到了证实:How to add native library to "java.library.path" with Eclipse launch (instead of overriding it)
请参阅 kevin cline 的评论。但是提到的解决方案是LD_LIBRARY_PATH
环境变量仅适用于 Linux。
添加 2
我想我没有把我的问题说清楚。让我这样说吧。
我的困惑是:JNI.dll
取决于 native.dll
. 两者他们不在main.exe
中的当前工作目录。实际上它们在 CWD 的子文件夹中。
如果我运行 main.exe
直接,我只需要设置 java.library.path = <other path>\MainFolder\SubFolder
.两个 DLL 均已正确找到。
但是如果我从 Eclipse 运行我的项目,除了设置java.library.path
,我必须将“\MainFolder\SubFolder”放在 %PATH% 环境变量中。
我只是不知道为什么 Eclipse 如此不同。
最佳答案
1)在当前目录中搜索。
2) 系统文件夹通常为 C:\Windows\System32(使用 CSIDL_SYSTEM 和 shgetspecialfolderpath()
获取给定系统上的正确文件夹)
3)Windows 文件夹 (C:\Windows )(CSIDL_WINDOWS 与 shgetspecialfolderpath()
以获取给定系统上的正确文件夹)
4)PAth环境变量下列出的所有文件夹
关于java - JNI DLL 如何搜索其依赖的 native DLL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29826714/