如何分发依赖于32位和64位机器DLL的应用程序

4

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

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

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

当我用64位dll替换32位dll时,它可以正常工作。如果可以避免维护两个不同版本(一个使用32位库,另一个使用64位库),我不想这样做。有没有一种方法可以构建应用程序,以便它可以找出需要使用哪个版本的库?
我们的项目是使用Ant构建的,尽管如果必要,我可以探索其他选择。

粗糙的方法是将两个JAR或DLL捆绑为资源,并在第三方JAR加载它之前,在应用程序启动时将正确的资源放置在PATH上。假设您的应用程序可以随意写入文件系统。 - millimoose
这是一个桌面应用程序吗? - Andrew Thompson
3个回答

2
你需要创建一个额外的ant目标,以便始终构建你的应用程序的x32和x64版本。

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

如果ant脚本始终生成这两个版本,那么这并不需要太多额外的努力。

你能提供一个如何指定32位和64位变体的例子吗?我正在查看Ant文档,但不确定应该如何编写。 - MxLDevs
我会定义一个额外的类路径/库类路径,名为x64Classpath,在那里包含x64硬件。然后,不使用:jar目标,而是使用:jar32和jar64目标,在其中使用x64库路径/类路径。 - AlexWien

1
当您执行loadLibrary时,可以使用System.getProperty("os.arch")来组合库名称。因此,您可以打包所有dll,相关版本将在运行时选择。

1
部署Java桌面应用程序,通常最好的选择是使用Java Web Start1安装应用程序。JWS适用于Windows、OS X和*nix。
JWS提供了许多吸引人的功能,包括但不限于启动画面、桌面集成、文件关联、自动更新(包括惰性下载和对更新的编程控制)、按平台、架构或Java版本分区原生和其他资源下载、运行时环境配置(最小J2SE版本、运行时选项、RAM等)、使用扩展轻松管理常见资源。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接