【发布时间】:2011-04-07 18:20:14
【问题描述】:
我正在尝试从 java 程序中调用本机可执行文件。我有三个 exe 文件,一个用于 win32,另一个用于 linux 32-bint,第三个用于 linux 64 位,现在在调用正确的可执行文件之前,我需要确定哪个平台程序正在运行。我可以通过简单地获取“os.name”系统属性来确定操作系统,但不确定如何确定它是 32 位还是 64 位平台?
【问题讨论】:
我正在尝试从 java 程序中调用本机可执行文件。我有三个 exe 文件,一个用于 win32,另一个用于 linux 32-bint,第三个用于 linux 64 位,现在在调用正确的可执行文件之前,我需要确定哪个平台程序正在运行。我可以通过简单地获取“os.name”系统属性来确定操作系统,但不确定如何确定它是 32 位还是 64 位平台?
【问题讨论】:
我认为如果没有本地调用(例如查询注册表),这是不可能的,但您可以使用系统属性 os.arch 来确定当前运行应用程序的 JRE 的位数。
(如果有人在 64 位机器上运行 32 位 JRE,你会得到 x64,所以你不知道你是否在 64 位架构上,所以应该调用 32 位版本 - 但反过来你可以安全地调用您的原生应用程序的 64 位版本)。
另一种方法可能是暴力破解: 为什么现在总是尝试 eto 运行 64 位版本,如果出现错误,使用 32 位二进制代替?
【讨论】:
以下是一些相关的系统属性以及我机器上的值:
os.arch: x86
os.name: Windows Vista
sun.arch.data.model: 32
根据这些信息,你应该可以猜到这样的事情:
String osName = System.getProperty("os.name").toLowerString();
String dataModel = System.getProperty("sun.arch.data.model");
boolean isWindows = osName.startsWith("windows");
boolean isLinux = osName.startsWith("linux"); // or whatever
boolean is32bit = "32".equals(dataModel);
boolean is64bit = "64".equals(dataModel);
if(isWindows && is32bit){
call32BitWindowsLib();
}
//etc.
如需更完整的参考,请参阅:
【讨论】:
java.vendor 系统属性的值使用正确的属性。 b) “未知”:这就是我使用"32".equals(dataModel) 等进行防御性编码的方式。