Мне нужна последняя компиляция всех возможных значений свойства os.arch в JRE 1.6 на Linux, Solaris и Windows.
Если возможно, укажите источник ваших результатов.
Мне нужны эти значения для выбора ресурсов в моем файле JNLP. В основном мне нужно назначить другую JVM-память на основе того, является ли JRE 32-битным или 64-битным.
В ожидании вашего ответа.
Благодаря
Ответ 2
Лучшее место, где вы можете найти это в собственном 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 возможные значения, которые это свойство может принимать, это 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 кажется более сложным, так как значение свойства в собственном коде происходит из макроса, определенного в java_props_md.c
для соляриев как:
sprops.os_arch = ARCHPROPNAME;
И этот макрос, определенный в следующем Makefile
как:
OTHER_CPPFLAGS += -DARCHPROPNAME='"$(ARCHPROP)"'
Итак, похоже, что это происходит из среды, где она скомпилирована (извините, что я не эксперт C, я просто догадываюсь, что, возможно, я могу немного вас погулять).
В папке Linux в src/linux/native/
нет java_props_md.c
, поэтому я предполагаю, что в этом случае возьмем тот же источник, что и Solaris (я снова предполагаю...).
ПРИМЕЧАНИЕ. Я использую версию 1.6 для получения этих значений, однако новые значения могут быть добавлены в новейшие версии Java, поэтому проверьте требуемую версию.
Надеюсь, что это поможет,