gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:09:07 25 4
gpt4 key购买 nike

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

最佳答案

您可以在自己的 jdk 中查找此内容的最佳位置。

查看 java.lang.System 您可以看到属性是在 initializeSystemClass 方法中使用 initProperties 方法进行初始化的,该方法依赖于 native 代码使用 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 为不同平台调用的 native 代码的来源,您可以看到 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);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 来说似乎更复杂,因为 native 代码中的属性值来自 java_props_md.c 中定义的宏。特定于 solaris 为:

sprops.os_arch = ARCHPROPNAME;

这个宏定义在下面Makefile如:

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

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

src/linux/native/ 的 Linux 文件夹中没有 java_props_md.c 所以我想在这种情况下采用与 solaris 相同的源(我我又猜了……)。

注意:我使用 1.6 版本来获取这个值,但是新的值会在最新的 java 版本中添加,所以请检查您需要的版本。

希望对你有帮助,

关于java - 32 位 JRE 和 64 位 Jre 中所有可能的 .arch 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10846105/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com