【问题标题】:How to reference a .dll from a .jar file如何从 .jar 文件中引用 .dll
【发布时间】:2010-03-30 15:58:49
【问题描述】:

我有一个应用程序使用 .jar 中的方法调用 .dll。这在我的机器上对我来说很好(当应用程序被解包或作为 .jar 本身运行时)但是当 application.jar 在另一台机器上运行时,系统路径上有外部 .dll,它无法运行 dll 文件.

.dll 是否必须位于特殊位置?我假设它在系统路径上会被找到。

提前致谢

道吉

【问题讨论】:

  • 可能在 ClassPath 上,但我真的不知道...
  • 您能否添加更多有关正在使用的操作系统的信息?此外,Java 代码是简单地使用 JNI 还是使用某种特定于平台的技术(例如使用 J-Integra 加载 COM 库)?最后,您是否尝试过简单地将 DLL 文件和 JAR 文件放在同一目录中?

标签: java jar dll


【解决方案1】:

java.library.path 解决方案并不总是好的:在很多情况下您无法更改 JVM 参数。更好的解决方案:

1) 已经提到:将 DLL 与 JAR 放在同一目录中,不幸的是,它使这样的 JAR 更难使用 - 现在 JAR 不仅仅是一个 JAR,而是有一个随附的 DLL

2) 将 DLL 作为正常资源放入 JAR,在 JAR 启动期间将此 DLL 提取到某个位置,例如$TMP,然后像上面一样使用 System.load(new File(...))。那么这个 JAR 只是一个 JAR,这个 JAR 的用户甚至可能不知道它使用了任何 DLL

您还可以使用 Maven NAR 插件,如果您使用 Maven 进行构建,该插件非常强大。见http://duns.github.com/maven-nar-plugin/

【讨论】:

    【解决方案2】:

    尝试使用:

    File dll = new File([...]);

    System.load(dll.getAbsolutPath());

    我会将 dll 打包在与您的 jar-archive 相同的目录中。

    【讨论】:

      【解决方案3】:

      我建议将它放在与您的应用程序相同的文件夹中。话虽如此,“它无法运行 dll 文件”有点含糊......你确定这不是另一个 DLL 版本不同的问题(因此没有正确加载,而不是在全部)?

      此外,库搜索路径由java.library.path parameter 定义。

      【讨论】:

        【解决方案4】:

        假设您使用的是 Sun JVM,则可以通过在命令行上设置 java 库路径在命令行上指定本机库的位置。

        这可以通过选项“-Djava.library.path=dll 目录”来完成

        这可能取决于库在 java 源代码中的加载方式。你有这个权限吗?可以发一下代码吗?

        如果 java 代码使用 System.load(String),它将期望 dll 的完整路径。

        如果它使用 System.loadLibrary(String),它只需要库名称,并将在 java.library.path 参数指定的位置进行搜索。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-09
          • 1970-01-01
          • 1970-01-01
          • 2015-05-07
          • 1970-01-01
          相关资源
          最近更新 更多