Java JNI DLL如何搜索其依赖的本机DLL?
假设我有Java JNI DLL如何搜索其依赖的本机DLL?,java,c++,dll,java-native-interface,dynamic-linking,Java,C++,Dll,Java Native Interface,Dynamic Linking,假设我有JNI.dll。它取决于native.dll。现在,我的Java应用程序调用System.loadLibrary(“JNI”) 下列文件夹布局是否有效 MainFolder |--main.exe |--SubFolder |--JNI.dll |--native.dll 我的猜测是,依赖解析有两个级别 [第1级]: System.loadLibrary(“JNI”)使用JVM属性java.library.path定位JNI.dl
JNI.dll
。它取决于native.dll
。现在,我的Java应用程序调用System.loadLibrary(“JNI”)
下列文件夹布局是否有效
MainFolder
|--main.exe
|--SubFolder
|--JNI.dll
|--native.dll
我的猜测是,依赖解析有两个级别
[第1级]:
System.loadLibrary(“JNI”)
使用JVM属性java.library.path
定位JNI.dll
[第二级]:
JNI.dll
依赖Windows系统机制定位native.dll
这是正确的吗
如果我将%\u JAVA\u OPTIONS%
设置为-Djava.library.path=MainFolder\SubFolder
,我认为它可以覆盖对JNI.dll
的搜索但它是否也包括对native.dll
的搜索?
加1
从这里看来,我对2个级别的猜测得到了证实:
见凯文·克莱恩的评论。但是上面提到的带有LD\u LIBRARY\u PATH
环境变量的解决方案仅适用于Linux
加2
我想我没有把问题说清楚。让我这样说吧
我的困惑是:JNI.dll
依赖于native.dll
两个都不在main.exe
的当前工作目录中。实际上,它们位于CWD的子文件夹中
如果我直接运行main.exe
,我只需要设置java.library.path=\MainFolder\SubFolder
。两个DLL都已正确找到
但是如果我从Eclipse运行我的项目,除了设置java.library.path
,我还必须将“\MainFolder\SubFolder”放在%path%环境变量中
我只是不知道为什么Eclipse如此不同。1)它在当前目录中搜索
2) 系统文件夹通常为C:\Windows\System32(使用CSIDL\U System和shgetspecialfolderpath()
获取给定系统上的rigth文件夹)
3) Windows文件夹(C:\Windows)(CSIDL_Windows,使用shgetspecialfolderpath()
在给定系统上获取正确的文件夹)
4) 路径环境变量下列出的所有文件夹都有一个类似的链接:
灵感来源于这条线索:
我开始怀疑我的用户%Path%是否太长了。因此,我将包含依赖DLL的文件夹路径从用户%path%的结尾移动到开头。现在可以了
首先,我得出结论,实现Windows的DLL查找算法的人有一些截断问题。我几乎把它看作另一个恼人的Windows bug。
但为了证实我的猜测,我编写了另一个具有类似DLL依赖关系的Windows应用程序。该应用程序运行良好!所以我必须回顾我的结论
我逐个检查了我的用户%PATH%条目,并将文件夹放置到每个可能的位置。最后,我找到了根本原因
我在用户%PATH%中有一个C:\MinGW\bin
条目,它恰好包含一个
libstdc++-6.dll(977KB)
但不幸的是,它不兼容
我需要一个(825KB)
。只有在我将文件夹放在MinGW之前,它才起作用
现在这个问题似乎已经解决了。但是另一个问题出现了,如果我想同时使用我的DLL和MinGW,我需要前后切换吗?就像它使用
a.DLL一样。看见它总是相对于执行加载的EXE。@IgorTandetnik很抱歉没有背景。我更新了我的问题。您可以修改PATH
环境变量(仅针对您的流程)并向其中添加MainFolder\SubFolder
。@IgorTandetnik Windows是否会自动在与JNI.dll相同的文件夹中查找native.dll?我不想修改路径。我95%确定它不会。应该很容易通过实验确定。