我想知道用户机器上安装的Java运行时是否支持32位和64位,我想从C内部执行此操作。我曾想过类似下面的内容可以解决这个问题: / p>
检测64位java:
int f=0
char *path = (char*) malloc(32768);
char out[1035];
FILE *fp;
if(f) fprintf(f,"Checking if 64-bit Java is available via the java command\n");
java64ok = 1;
strcpy(path,"java -d64 -version 2>&1");
fp = _popen(path, "r");
if (fp == NULL) {
if(f) fprintf(f,"Failed to run command\n" );
}
if(fgets(out, sizeof(out), fp) != NULL){
if(strncmp(out,"Error",5)==0){
java64ok = 0;
}
while (fgets(out, sizeof(out), fp) != NULL) {}
}
if (feof(fp)){
pclose( fp );
}
else{
if(f) fprintf(f, "Error: Failed to read the pipe to the end.\n");
}
检测32位Java:
if(f) fprintf(f,"Checking if 32-bit Java is available via the java command\n");
java32ok = 1;
strcpy(path,"java -d32 -version 2>&1");
fp = _popen(path, "r");
if (fp == NULL) {
if(f) fprintf(f,"Failed to run command\n" );
}
if(fgets(out, sizeof(out), fp) != NULL){
if(strncmp(out,"Error",5)==0){
java32ok = 0;
}
while (fgets(out, sizeof(out), fp) != NULL) {}
}
if (feof(fp)){
pclose( fp );
}
else{
if(f) fprintf(f, "Error: Failed to read the pipe to the end.\n");
}
不幸的是,如果用户正在运行64位系统,如果C代码被编译为32位可执行文件,则仅检测到32位java,并且如果程序是,则仅检测到64位Java编译为64位程序。
答案 0 :(得分:2)
具有合理的可靠性,您可以检查%SYSTEMROOT%\ SysWOW64 \ java.exe(这是32位java.exe驻留在64位计算机上的位置)和%SYSTEMROOT%\ System32 \ java.exe(这是哪里64位Java驻留在64位计算机上,32位java驻留在32位计算机上。)
使用Windows API函数GetEnvironmentVariable来推导%SYSTEMROOT%,或者,为了开始,硬编码为“C:\ Windows”,必要时转义\。
答案 1 :(得分:0)
如何从外部检测版本取决于平台。我建议你运行一个简短的Java程序来告诉你。
public class Bitness {
public static void main(String... ignored) {
System.out.println(is64Bit() ? "64" : "32");
}
private static boolean is64Bit0() {
String systemProp;
systemProp = System.getProperty("com.ibm.vm.bitmode");
if (systemProp != null) {
return "64".equals(systemProp);
}
systemProp = System.getProperty("sun.arch.data.model");
if (systemProp != null) {
return "64".equals(systemProp);
}
systemProp = System.getProperty("java.vm.version");
return systemProp != null && systemProp.contains("_64");
}
}
这样您就可以运行java -cp {whatever} Bitness
并告诉您。
答案 2 :(得分:0)
Bathsheba的建议是相当可靠的,虽然取决于系统上如何定义PATH变量,但有可能在%SYSTEMROOT%\之前找到另一个java.exe二进制文件,因此有可能出现不同的情况使用java版本。
我的建议是首先解析PATH环境变量并找到java的第一个命中。第二步是查看java.exe文件的COFF头。 使用ImageNtHeader功能,您可以查询NT标头,其中包含 FileHeader 字段,即IMAGE_FILE_HEADER。
以下是关于如何实现这一点的一些示例:
https://stackoverflow.com/a/4316804/435583
希望这可以帮助你 干杯