1

我想知道安装在用户机器上的 Java 运行时是否支持 32 位和 64 位,并且我想从 C 中执行此操作。我曾认为类似以下内容可以解决问题:

检测 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 位程序。

4

3 回答 3

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”,必要时转义 \。

于 2013-09-19T07:25:55.990 回答
0

Bathsheba 的建议非常可靠,尽管取决于系统上 PATH 变量的定义方式,可能会在 %SYSTEMROOT%\ 之前找到另一个 java.exe 二进制文件,因此有可能存在不同的 java 版本用过的。

我的建议是首先解析 PATH 环境变量并找到 java 的第一个命中。第二步是查看 java.exe 文件的 COFF 标头。使用ImageNtHeader函数,您可以查询 NT 标头,其中包含字段FileHeader,即IMAGE_FILE_HEADER

以下是有关如何实现此功能的一些示例:
https ://stackoverflow.com/a/4316804/435583

希望这可以帮助你。
干杯

于 2013-09-19T08:02:12.883 回答
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了,它会告诉你。

于 2013-09-19T07:47:50.430 回答