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 (64 ビット マシン上の 32 ビット java.exe が存在する場所) と %SYSTEMROOT%\System32\java.exe (64 ビット Java が存在する場所) を確認できます。は 64 ビット マシン上にあり、32 ビット Java は 32 ビット マシン上にあります。)

Windows API 関数 GetEnvironmentVariable を使用して %SYSTEMROOT% を推測するか、開始するには、「C:\Windows」にハードコーディングし、必要に応じて \ をエスケープします。

于 2013-09-19T07:25:55.990 に答える
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 に答える