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