java - JNI DLL 如何搜索其依赖的 native DLL?

标签 java c++ dll java-native-interface dynamic-linking

假设我有 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/

相关文章:

java - 如何在 ListView 适配器线性布局中添加项目

Java套接字编程: Detect whether client and server are connected

Java - Spring Boot - Reactive Redis Stream (TEXT_EVENT_STREAM_VALUE)

c++ - CGAL:找到一个点所属的面/三角形?

C# 孙项目 DLL 未包含在 msbuild 包中

C#插件系统设计

c# - 在外部程序中加载 DLL?

Java:如何将 HashMap<String, Object> 转换为数组

c++ - 如何打印 MergeSort 的所有中间步骤?

c++ - 在 Swift 项目中使用 C++ 文件