java:检测是否可以执行32位或64位应用程序

java:检测是否可以执行32位或64位应用程序,java,architecture,Java,Architecture,我有一个适用于windows、*nix和mac的32位和64位可执行文件。 因此,我的java应用程序需要检测可以运行的程序的操作系统和位体系结构,以知道启动哪个程序 我已经寻找了一个解决方案来检测操作系统、jvm等的比特率,但我真的没有找到唯一一个在任意操作系统上返回32或64的函数。 另外,我发现的答案是“我认为os.arch应该返回这个,如果可能在某种windows框上”-wtf 问题: 我如何知道哪个应用程序体系结构肯定会使用Runtime.getRuntime().exec()执行 所

我有一个适用于windows、*nix和mac的32位和64位可执行文件。 因此,我的java应用程序需要检测可以运行的程序的操作系统和位体系结构,以知道启动哪个程序

我已经寻找了一个解决方案来检测操作系统、jvm等的比特率,但我真的没有找到唯一一个在任意操作系统上返回32或64的函数。 另外,我发现的答案是“我认为os.arch应该返回这个,如果可能在某种windows框上”-wtf

问题: 我如何知道哪个应用程序体系结构肯定会使用Runtime.getRuntime().exec()执行

所以我要求这样一个函数:

public int getApplicationArchitecture(){
   if(osCanRun32bit())
       return 32;
   else
       return 64;
}
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;

public static int getApplicationArchitecture(){
    if(isWindows()){
        String arch = System.getenv("PROCESSOR_ARCHITECTURE");
        String wow64Arch = System.getenv("PROCESSOR_ARCHITEW6432");

        if(arch!=null && arch.endsWith("64")){
            return 64;
        }
        if(wow64Arch != null && wow64Arch.endsWith("64")){
            return 64;
        }
    }
    else if(isMac() || isUnix()){
        try{
            Process p = Runtime.getRuntime().exec("uname -m");
            InputStream is = p.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String line = br.readLine();
            if(line.indexOf("64")!=-1){
                return 64;
            }
        }catch(Exception e){}
    }

    // on unkown OS
    if(System.getProperty("os.arch").equals("x86")){
        return 32;
    }
    return 64;
}
可以假设使用了如下类(复制自):


thx对此的任何提示只需从依赖于操作系统的JAVA执行shell命令并检查其输出。 例如: *Windows:wmic操作系统获取osarchitecture
*Linux-like:uname-m

我当前的解决方案如下所示:

public int getApplicationArchitecture(){
   if(osCanRun32bit())
       return 32;
   else
       return 64;
}
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;

public static int getApplicationArchitecture(){
    if(isWindows()){
        String arch = System.getenv("PROCESSOR_ARCHITECTURE");
        String wow64Arch = System.getenv("PROCESSOR_ARCHITEW6432");

        if(arch!=null && arch.endsWith("64")){
            return 64;
        }
        if(wow64Arch != null && wow64Arch.endsWith("64")){
            return 64;
        }
    }
    else if(isMac() || isUnix()){
        try{
            Process p = Runtime.getRuntime().exec("uname -m");
            InputStream is = p.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String line = br.readLine();
            if(line.indexOf("64")!=-1){
                return 64;
            }
        }catch(Exception e){}
    }

    // on unkown OS
    if(System.getProperty("os.arch").equals("x86")){
        return 32;
    }
    return 64;
}
最后,我将检查64位操作系统特定的,如果不能确定,检查OS.arch属性-这是一种猜测位


如果安装了32位应用程序,可能会有人对此进行评论或改进

32位应用程序肯定会在这两个平台上“执行”。可能重复@EJP,这是错误的,有些情况下,当您无法在64位平台上运行32位应用程序时,例如,当您在64位ubuntu上设置32位skype时,运行它需要很多额外的库。
System.getProperty(“os.arch”).contains(“64”)?64:32
(“amd64”/“i586”)@DmitryGinzburg amd64/i586是什么意思?此值是唯一不匹配的包含(“64”)值,是否为64?所以你的解决方案可以在所有主要系统上使用?谢谢,我添加了你的uname解决方案,但是由于wmic输出解析起来有点复杂,而且我没有windows,而且似乎有一个getenv解决方案,我会坚持在windows上使用哪些环境属性