【问题标题】:How to distribute an application that relies on DLL's for 32-bit and 64-bit machines如何为 32 位和 64 位机器分发依赖 DLL 的应用程序
【发布时间】:2013-07-26 18:02:22
【问题描述】:

我有一个使用第 3 方 jar (utils.jar) 的应用程序,它调用第 3 方 DLL (utils.dll)。 jar 文件管理对 DLL 的调用,包括 DLL 的名称。 DLL 有 32 位版本和 64 位版本。

目前,该应用程序只能在 32 位机器上运行。当我尝试在 64 位机器上运行它时,它告诉我

Can't load IA 32-bit .dll on a AMD 64-bit platform

当我用 64 位替换 32 位 dll 时,它工作正常。如果可以避免的话,我不想维护两个单独的版本(一个使用 32 位库,另一个使用 64 位库)。有没有办法构建应用程序,以便确定它需要使用哪个版本的库?

我们的项目是使用 Ant 构建的,但如有必要,我可以探索其他替代方案。

【问题讨论】:

  • 最老套的方法是将 JAR 或 DLL 捆绑为资源,并在第三方 JAR 加载之前启动应用程序时将正确的放在 PATH 上。假设您的应用程序可以随意写入文件系统。
  • 这是桌面应用吗?

标签: java ant desktop-application native-code


【解决方案1】:

您必须创建一个附加的 ant 目标,以便它始终构建您的应用程序的 x32 和 x64 变体。

我不想维护两个单独的版本

如果你的脚本总是产生两个交付,那它就不需要太多额外的努力了。

【讨论】:

  • 您能否举例说明我将如何指定 32 位和 64 位变体?我正在浏览 ant 文档,但不确定它是如何编写的。
  • 我将定义一个名为 x64Classpath 的附加类路径/库类路径,然后您将包含 x64 硬。然后 :jar 目标是一个 :jar32 和一个 jar64 目标,您使用 x64 库路径/类路径
【解决方案2】:

当您执行 loadLibary 时,您可以使用 System.getProperty("os.arch") 组成库名称。因此,您捆绑所有 dll,并在运行时选择相关版本。

【讨论】:

    【解决方案3】:

    对于部署 Java 桌面应用程序,最好的选择通常是安装该应用程序。使用Java Web Start1。 JWS 适用于 Windows、OS X 和 *nix。

    1. JWS 提供了许多吸引人的功能,包括但不限于启动画面、桌面集成、文件关联、自动更新(包括延迟下载和对更新的编程控制)、按平台划分本地和其他资源下载,架构 或 Java 版本、运行时环境配置(最低 J2SE 版本、运行时选项、RAM 等)、使用扩展轻松管理公共资源..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-18
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-27
      • 2012-05-22
      • 1970-01-01
      相关资源
      最近更新 更多