【问题标题】:Provide DLL path to System.loadLibrary on export在导出时提供 System.loadLibrary 的 DLL 路径
【发布时间】:2020-03-09 17:17:36
【问题描述】:

我想导出我使用 JNI 接口的 Java 应用程序,并通过 System.loadLibrary("dllName") 加载一个 DLL。

DLL 文件存在于 Java Project 文件夹以及 C 驱动器中,这是 JVM 在运行时搜索 DLL 的地方之一。

问题:当我将此项目导出为 Jar 并将其提供给客户端时,客户端应该能够运行该工具,而无需输入 Dll 文件。我想不出通过其他方式来实现这一点;使用System.load("path:\\") 提供绝对路径,因为我不知道用户会将 Jar 文件下载到哪里。

【问题讨论】:

    标签: java dll java-native-interface


    【解决方案1】:

    如果与 JAR 文件位于同一目录中,则无论工作目录如何,以下 sn-p 都会加载 DLL:

    CodeSource codeSource = MainClass.class.getProtectionDomain().getCodeSource();
    File jarFile = new File(codeSource.getLocation().toURI().getPath());
    File parentDir = jarFile.getParentFile();
    File dllFile = new File(parentDir, "my.dll");
    System.load(dllFile.getPath());
    

    【讨论】:

    • 谢谢。这里的 MainClass 是什么,如果我在项目目录中只有 dll,您的解决方案是否有效。
    • MainClass 是这个 sn-p 所在的类的类名。DLL 必须与 JAR 文件位于同一目录中。如果相对位置不同,只需将其添加到“my.dll”之前,例如父目录的“../my.dll”。
    • woooow,它对我有用,谢谢你的朋友
    【解决方案2】:

    您需要将 DLL 放在与应用程序运行相同的路径中、系统路径中或在启动应用程序之前将其路径添加到 PATH 变量中。

    【讨论】:

    • 我对您的回答感到困惑,请您举例说明一下。
    • 定义'与应用程序运行相同的路径'。需要的是当前工作目录,但不清楚这是否是您真正的意思。
    【解决方案3】:

    看看Runtime.load

    将指定的文件名加载为动态库。文件名 参数必须是完整的路径名。从 java_g 它将 在“.so”之前自动插入“_g”(例如 Runtime.getRuntime().load("/home/avh/lib/libX11.so");)。

    首先,如果有安全管理器,则调用它的 checkLink 方法 以文件名作为参数。这可能会导致安全 例外。

    这类似于方法 loadLibrary(String),但它接受一个 通用文件名作为参数,而不仅仅是库名, 允许加载任何本机代码文件。

    方法 System.load(String) 是常规且方便的方法 调用此方法的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-22
      • 1970-01-01
      • 1970-01-01
      • 2013-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多