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

时间:2012-06-01 07:23:27

标签: java jnlp

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

3 个答案:

答案 0 :(得分:10)

你可以在自己的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以查看从JNI调用的java.lang.System.initProperties方法。来自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);,而sprops来自java_props_t *sprops = GetJavaProperties(env);。所以让我们看GetJavaProperties(env),这个方法在java_props.h中定义为:

java_props_t *GetJavaProperties(JNIEnv *env);

实施似乎取决于操作系统。

最后查看GetJavaProperties的具体实现; 在Windows中,此属性可以采用的值ia64amd64x86unknown。您可以从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中定义为:

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

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

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

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

希望它有所帮助,

答案 1 :(得分:8)

您还可以编写如下代码来查找操作系统及其archi。

$( document ).ready(function() {
    $("#button_some_id").click(function() {$("#item_some_id").toggle();});
});

请参阅以下链接

  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

答案 2 :(得分:1)

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

尝试一下后,树莓派2(ARMv7)似乎只是返回字符串arm

树莓派3(ARMv8)返回aarch64

x86 64位台式机和服务器返回amd64

希望这对某人有帮助。