【问题标题】:Determine runtime system for process execution from java program从java程序确定进程执行的运行时系统
【发布时间】:2011-04-07 18:20:14
【问题描述】:

我正在尝试从 java 程序中调用本机可执行文件。我有三个 exe 文件,一个用于 win32,另一个用于 linux 32-bint,第三个用于 linux 64 位,现在在调用正确的可执行文件之前,我需要确定哪个平台程序正在运行。我可以通过简单地获取“os.name”系统属性来确定操作系统,但不确定如何确定它是 32 位还是 64 位平台?

【问题讨论】:

标签: java process runtime


【解决方案1】:

我认为如果没有本地调用(例如查询注册表),这是不可能的,但您可以使用系统属性 os.arch 来确定当前运行应用程序的 JRE 的位数。

(如果有人在 64 位机器上运行 32 位 JRE,你会得到 x64,所以你不知道你是否在 64 位架构上,所以应该调用 32 位版本 - 但反过来你可以安全地调用您的原生应用程序的 64 位版本)。

另一种方法可能是暴力破解: 为什么现在总是尝试 eto 运行 64 位版本,如果出现错误,使用 32 位二进制代替?

【讨论】:

    【解决方案2】:

    以下是一些相关的系统属性以及我机器上的值:

    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.
    

    如需更完整的参考,请参阅:

    【讨论】:

    • sun.arch.data.model 不是 vm 规范的一部分,并且可能不存在于其他供应商(例如 ibm)的 jre 中。请注意,dataModel 也可能是“未知的”
    • a) 我很确定每个其他 VM 供应商都会有类似的属性,因此只需研究它们并根据java.vendor 系统属性的值使用正确的属性。 b) “未知”:这就是我使用"32".equals(dataModel) 等进行防御性编码的方式。
    猜你喜欢
    • 2016-12-29
    • 2023-03-08
    • 2011-05-13
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 2019-04-13
    • 1970-01-01
    相关资源
    最近更新 更多