32 位 JRE 和 64 位 Jre 中的所有可能值 os.arch

2022-09-01 05:24:29

我需要在Linux,Solaris和Windows上的JRE 1.6中os.arch属性的所有可能值的最新编译。如果可能的话,请引用您的发现来源。我需要此值来选择 JNLP 文件中的资源。基本上,我需要根据JRE是32位还是64位来分配不同的JVM内存。等待您的答案。谢谢


答案 1

你可以寻找这个的最好的地方是在自己的jdk。

查看,您可以看到属性在方法中使用方法初始化,该方法依赖于使用以下内容的本机代码:java.lang.SysteminitializeSystemClassinitPropertiesJNI

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
    ...
    ...
}

如果检查为不同平台调用的此本机代码的源代码,则可以看到系统属性的可能值。所以一步一步来做:initPropertiesos.arch

首先查看以查看从 调用的方法。来自 System.cSystem.cJNIjava.lang.System.initProperties

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);

因此,如您所见,它来自并使用.所以让我们看看,这种方法在java_props.h中被定义为:os.archPUTPROP(props, "os.arch", sprops->os_arch);spropsjava_props_t *sprops = GetJavaProperties(env);GetJavaProperties(env)

java_props_t *GetJavaProperties(JNIEnv *env);

而实现似乎取决于操作系统。

所以最后找一个具体的实现;在 Windows 中,此属性可以采用的可能值为 、 、 或 。您可以从java_props_md.c文件中看到:GetJavaPropertiesia64amd64x86unknown

#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 来说,似乎更复杂,因为本机代码中的属性值来自java_props_md.c 中定义的宏,该宏特定于 solaris,如下所示:

sprops.os_arch = ARCHPROPNAME;

这个宏在下面的Makefile中被定义为:

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

所以看起来这来自编译的环境(抱歉,我不是C专家,我只是猜测,但也许我可以指导你一点)。

在Linux文件夹中没有,所以我想在这种情况下采取与solaris相同的来源(我再次猜测...)。src/linux/native/java_props_md.c

注意:我使用1.6版本来获取此值,但是可以在最新的java版本中添加新值,因此请检查所需的版本。

希望它有帮助,


答案 2

我在2019年遇到了同样的问题。特别是在手臂处理器方面。

在尝试之后,树莓派2(ARMv7)似乎只是简单地返回字符串 。arm

树莓派 3 (ARMv8) 返回 。aarch64

x86 64 位桌面和服务器返回 。amd64

希望这有助于某人。


推荐