Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JNI DLL如何搜索其依赖的本机DLL?_Java_C++_Dll_Java Native Interface_Dynamic Linking - Fatal编程技术网

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%确定它不会。应该很容易通过实验确定。