32 位 JRE 和 64 位 Jre 中的所有可能值 os.arch
我需要在Linux,Solaris和Windows上的JRE 1.6中os.arch属性的所有可能值的最新编译。如果可能的话,请引用您的发现来源。我需要此值来选择 JNLP 文件中的资源。基本上,我需要根据JRE是32位还是64位来分配不同的JVM内存。等待您的答案。谢谢
我需要在Linux,Solaris和Windows上的JRE 1.6中os.arch属性的所有可能值的最新编译。如果可能的话,请引用您的发现来源。我需要此值来选择 JNLP 文件中的资源。基本上,我需要根据JRE是32位还是64位来分配不同的JVM内存。等待您的答案。谢谢
你可以寻找这个的最好的地方是在自己的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
System.c
JNI
java.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.arch
PUTPROP(props, "os.arch", sprops->os_arch);
sprops
java_props_t *sprops = GetJavaProperties(env);
GetJavaProperties(env)
java_props_t *GetJavaProperties(JNIEnv *env);
而实现似乎取决于操作系统。
所以最后找一个具体的实现;在 Windows 中,此属性可以采用的可能值为 、 、 或 。您可以从java_props_md.c
文件中看到:GetJavaProperties
ia64
amd64
x86
unknown
#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版本中添加新值,因此请检查所需的版本。
希望它有帮助,
我在2019年遇到了同样的问题。特别是在手臂处理器方面。
在尝试之后,树莓派2(ARMv7)似乎只是简单地返回字符串 。arm
树莓派 3 (ARMv8) 返回 。aarch64
x86 64 位桌面和服务器返回 。amd64
希望这有助于某人。