smw*_*dia 5 c++ java dll java-native-interface dynamic-linking
说我有JNI.dll.这取决于native.dll.现在我的Java应用程序调用System.loadLibrary("JNI").
以下文件夹布局是否有效?
MainFolder
|--main.exe
|--SubFolder
|--JNI.dll
|--native.dll
Run Code Online (Sandbox Code Playgroud)
我的猜测是,有两个级别的依赖解析.
[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吗?
似乎我从这里确认了2个级别的猜测:如何在Eclipse启动时将本机库添加到"java.library.path"(而不是覆盖它)
请参阅kevin cline的评论.但是上面提到的LD_LIBRARY_PATH环境变量解决方案仅适用于Linux.
我想我没有说清楚我的问题.让我这样说吧.
我的困惑是: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如此不同.
类似的链接:我必须将所有依赖的 DLL 放入 JDK 的 bin 文件夹中吗?
受到此线程的启发:系统与用户 PATH 环境变量...只有当我将路径添加到用户 PATH 时,winmerge 才起作用
我开始怀疑我的用户%Path%是否太长。因此,我将包含我的依赖 DLL 的文件夹路径从User %PATH% 的末尾移至开头。现在可以了!
首先,我得出的结论是,实现 Windows DLL 查找算法的人存在一些截断问题。我几乎认为这是另一个令人讨厌的 Windows Bug。
但我编写了另一个具有类似 DLL 依赖项的 Windows 应用程序来证实我的猜测。该应用程序运行良好!所以我必须回顾我的结论。
我一一检查了我的 User %PATH% 条目,并将该文件夹放置到每个可能的位置。最后,我找到了根本原因。
我
C:\MinGW\bin在 User %PATH% 中有一个条目,它恰好包含 alibstdc++-6.dll (977KB)但不幸的是,它与我需要的不兼容(825KB)。仅当我将文件夹放在 MinGW 之前时它才有效。
现在这个问题似乎已经解决了。但又出现了一个问题,如果我想同时使用 DLL 和 MinGW,是否需要来回切换?
| 归档时间: |
|
| 查看次数: |
1234 次 |
| 最近记录: |