在Windows上从C内检测32/64位Java

时间:2013-09-19 07:20:21

标签: java c windows

我想知道用户机器上安装的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位程序。

3 个答案:

答案 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

希望这可以帮助你 干杯

相关问题