web-dev-qa-db-ja.com

32ビットJREおよび64ビットJreのArchのすべての可能な値

Linux、Solaris、およびWindows上のJRE 1.6のos.Archプロパティのすべての可能な値の最新のコンパイルが必要です。可能であれば、調査結果の出典を引用してください。 JNLPファイルでリソースを選択するには、この値が必要です。基本的に、JREが32ビットか64ビットかに基づいて、異なるJVMメモリを割り当てる必要があります。あなたの答えを待っています。ありがとう

31
Brahma

これを探すのに最適な場所は、独自のjdkです。

_Java.lang.System_を見ると、initializeSystemClassメソッドを使用してinitPropertiesメソッドでプロパティが初期化されていることがわかります。これは、JNIを使用するネイティブコードに依存しています。

_private static native Properties initProperties(Properties props);

/**
 * Initialize the system class.  Called after thread initialization.
 */
private static void initializeSystemClass() {

    // VM might invoke JNU_NewStringPlatform() to set those encoding
    // sensitive properties (user.home, user.name, boot.class.path, etc.)
    // during "props" initialization, in which it may need access, via
    // System.getProperty(), to the related system encoding property that
    // have been initialized (put into "props") at early stage of the
    // initialization. So make sure the "props" is available at the
    // very beginning of the initialization and all system properties to
    // be put into it directly.
    props = new Properties();
    initProperties(props);  // initialized by the VM
    ...
    ...
}
_

initPropertiesから呼び出されたこのネイティブコードのソースをさまざまなプラットフォームで確認すると、_os.Arch_システムプロパティの可能な値を確認できます。だからそれを段階的に行います:

最初に_System.c_を見て、_Java.lang.System.initProperties_から呼び出されたJNIメソッドを確認します。から _System.c_

_JNIEXPORT jobject JNICALL
Java_java_lang_System_initProperties(JNIEnv *env, jclass cla, jobject props)
{
    char buf[128];
    Java_props_t *sprops = GetJavaProperties(env);
    jmethodID putID = (*env)->GetMethodID(env,
                                          (*env)->GetObjectClass(env, props),
                                          "put",
            "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");

    if (sprops == NULL || putID == NULL ) return NULL;

    PUTPROP(props, "Java.specification.version",
            JDK_MAJOR_VERSION "." JDK_MINOR_VERSION);
    PUTPROP(props, "Java.specification.name",
            "Java Platform API Specification");
    PUTPROP(props, "Java.specification.vendor", "Sun Microsystems Inc.");

    PUTPROP(props, "Java.version", RELEASE);
    PUTPROP(props, "Java.vendor", VENDOR);
    PUTPROP(props, "Java.vendor.url", VENDOR_URL);
    PUTPROP(props, "Java.vendor.url.bug", VENDOR_URL_BUG);

    ...

    /* os properties */
    PUTPROP(props, "os.name", sprops->os_name);
    PUTPROP(props, "os.version", sprops->os_version);

    // HERE IS THE `os.Arch` PROPERTY :)

    PUTPROP(props, "os.Arch", sprops->os_Arch);
_

ご覧のとおり、_os.Arch_はPUTPROP(props, "os.Arch", sprops->os_Arch);から取得され、spropsJava_props_t *sprops = GetJavaProperties(env);を使用して実現されます。 GetJavaProperties(env)を見てみましょう。このメソッドは _Java_props.h_ で次のように定義されています。

Java_props_t *GetJavaProperties(JNIEnv *env);

そして実装はOSに依存しているようです。

最後に、GetJavaPropertiesの特定の実装を探します。 Windowsでは、このプロパティが取り得る値は_ia64_、_AMD64_、_x86_、またはunknownです。あなたは _Java_props_md.c_ file から見ることができます:

_#if _M_IA64
        sprops.os_Arch = "ia64";
#Elif _M_AMD64
        sprops.os_Arch = "AMD64";
#Elif _X86_
        sprops.os_Arch = "x86";
#else
        sprops.os_Arch = "unknown";
#endif
_

Solarisの場合、ネイティブコードのプロパティ値は、次のようにsolarisに固有の _Java_props_md.c_ で定義されたマクロから取得されるため、より複雑に見えます。

_sprops.os_Arch = ARCHPROPNAME;
_

そして、このマクロは以下で定義されています Makefile as:

OTHER_CPPFLAGS += -DARCHPROPNAME='"$(ARCHPROP)"'

だから、これはコンパイルされた環境から来ているように見えます(申し訳ありませんが、Cのエキスパートではありません。たぶん私は推測しているだけですが、少しはガイドできます)。

_src/linux/native/_のLinuxフォルダーには_Java_props_md.c_がないので、この場合、solarisと同じソースを使用していると思います(もう一度推測します...)。

[〜#〜]注[〜#〜]:この値を取得するために1.6バージョンを使用していますが、新しい値はnewest =に追加できますJavaバージョンなので、必要なバージョンを確認してください。

それが役に立てば幸い、

10
albciff

以下のようなコードを書いて、OSとそのアーキテクチャを見つけることもできます。

import Java.util.HashMap;
import Java.util.Map;

import org.Apache.commons.lang.SystemUtils;


public class PlatformDetection {
    private String os;
    private String Arch;
    public static String OS_WINDOWS = "windows";
    public static String OS_OSX = "osx";
    public static String OS_SOLARIS = "solaris";
    public static String OS_LINUX = "linux";
    public static String Arch_PPC = "ppc";
    public static String Arch_X86_32 = "x86_32";
    public static String Arch_X86_64 = "x86_64";

    public PlatformDetection() {
        // resolve OS
        if (SystemUtils.IS_OS_WINDOWS) {
            this.os = OS_WINDOWS;
        } else if (SystemUtils.IS_OS_MAC_OSX) {
            this.os = OS_OSX;
        } else if (SystemUtils.IS_OS_SOLARIS) {
            this.os = OS_SOLARIS;
        } else if (SystemUtils.IS_OS_LINUX) {
            this.os = OS_LINUX;
        } else {
            throw new IllegalArgumentException("Unknown operating system " + SystemUtils.OS_NAME);
        }

        // resolve architecture
        Map<String, String> archMap = new HashMap<String, String>();
        archMap.put("x86", Arch_X86_32);
        archMap.put("i386", Arch_X86_32);
        archMap.put("i486", Arch_X86_32);
        archMap.put("i586", Arch_X86_32);
        archMap.put("i686", Arch_X86_32);
        archMap.put("x86_64", Arch_X86_64);
        archMap.put("AMD64", Arch_X86_64);
        archMap.put("powerpc", Arch_PPC);
        this.Arch = archMap.get(SystemUtils.OS_Arch);
        if (this.Arch == null) {
            throw new IllegalArgumentException("Unknown architecture " + SystemUtils.OS_Arch);
        }
    }

    public String getOs() {
        return os;
    }

    public String getArch() {
        return Arch;
    }

    public void setArch(String Arch) {
        this.Arch = Arch;
    }

    public void setOs(String os) {
        this.os = os;
    }

    public String toString() {

        return os + "_" + Arch;
    }
}

以下のリンクを参照してください

  1. https://github.com/trustin/os-maven-plugin/blob/master/src/main/Java/kr/motd/maven/os/Detector.Java

  2. https://github.com/rachelxqy/EligibilityCriteriaModeling/blob/57001f6d86084f074f4ca6aaff157e93ef6abf95/src/main/Java/edu/mayo/bmi/medtagger/ml/util/PlatformDetection.Java

私は2019年に同じ問題に遭遇しました。特にARMプロセッサに関しては。

試してみると、Raspberry Pi 2(ARMv7)は単に文字列armを返すようです。

Raspberry Pi 3(ARMv8)はaarch64を返します。

x86 64ビットデスクトップおよびサーバーはAMD64を返します。

これが誰かを助けることを願っています。

0
Malt