world tutorial hello gui create java jnlp

java - tutorial - Todos los valores posibles os.arch en 32bit JRE y en 64bit Jre



swing java (2)

Necesito la última compilación de todos los valores posibles de la propiedad os.arch en JRE 1.6 en Linux, Solaris y Windows. Si es posible, indique la fuente de sus hallazgos. Necesito estos valores para seleccionar recursos en mi archivo JNLP. Básicamente, necesito asignar diferentes memorias JVM en función de si el JRE es de 32 bits o de 64 bits. En espera de su respuesta. Gracias


El mejor lugar donde puedes buscarlo es en el propio jdk.

Mirando en java.lang.System puede ver que las propiedades se inicializan en el método initializeSystemClass usando el método initProperties que se basa en el código nativo usando 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 ... ... }

Si revisa la fuente de este código nativo llamado de initProperties para las diferentes plataformas, puede ver los valores posibles para la propiedad del sistema os.arch . Así que hazlo paso a paso:

Primero observe System.c para ver el método JNI llamado desde java.lang.System.initProperties . Desde 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);

Entonces, como puedes ver, os.arch proviene de PUTPROP(props, "os.arch", sprops->os_arch); y los sprops se han logrado utilizando java_props_t *sprops = GetJavaProperties(env); . así que veamos GetJavaProperties(env) , este método se define en java_props.h como:

java_props_t *GetJavaProperties(JNIEnv *env);

Y la implementación parece que depende del SO.

Así que finalmente buscando una implementación específica para GetJavaProperties ; en Windows, los valores posibles que puede tomar esta propiedad son ia64 , amd64 , x86 o unknown . Puedes ver desde el archivo java_props_md.c :

#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

Para Solaris parece más complicado ya que el valor de la propiedad en el código nativo proviene de una Macro definida en java_props_md.c específica para solaris como:

sprops.os_arch = ARCHPROPNAME;

Y esta Macro está definida en el siguiente Makefile como:

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

Así que parece que esto viene del entorno, donde está compilado (lo siento, no soy un experto en C, pero supongo que, sin embargo, quizás pueda guiarte un poco).

En la carpeta de Linux en src/linux/native/ no hay java_props_md.c así que supongo que en este caso tome la misma fuente que solaris (supongo que otra vez ...).

NOTA : Utilizo la versión 1.6 para obtener estos valores, sin embargo, se agregarán nuevos valores en las versiones más nuevas de Java, así que verifique la versión requerida.

Espero eso ayude,


También puede escribir algún código como el siguiente para averiguar os y su archi.

import java.util.HashMap; import java.util.Map; import org.apache.commons.lang.SystemUtils; public class PlatformDetection { private String os; private String arch; public static String OS_WINDOWS = "windows"; public static String OS_OSX = "osx"; public static String OS_SOLARIS = "solaris"; public static String OS_LINUX = "linux"; public static String ARCH_PPC = "ppc"; public static String ARCH_X86_32 = "x86_32"; public static String ARCH_X86_64 = "x86_64"; public PlatformDetection() { // resolve OS if (SystemUtils.IS_OS_WINDOWS) { this.os = OS_WINDOWS; } else if (SystemUtils.IS_OS_MAC_OSX) { this.os = OS_OSX; } else if (SystemUtils.IS_OS_SOLARIS) { this.os = OS_SOLARIS; } else if (SystemUtils.IS_OS_LINUX) { this.os = OS_LINUX; } else { throw new IllegalArgumentException("Unknown operating system " + SystemUtils.OS_NAME); } // resolve architecture Map<String, String> archMap = new HashMap<String, String>(); archMap.put("x86", ARCH_X86_32); archMap.put("i386", ARCH_X86_32); archMap.put("i486", ARCH_X86_32); archMap.put("i586", ARCH_X86_32); archMap.put("i686", ARCH_X86_32); archMap.put("x86_64", ARCH_X86_64); archMap.put("amd64", ARCH_X86_64); archMap.put("powerpc", ARCH_PPC); this.arch = archMap.get(SystemUtils.OS_ARCH); if (this.arch == null) { throw new IllegalArgumentException("Unknown architecture " + SystemUtils.OS_ARCH); } } public String getOs() { return os; } public String getArch() { return arch; } public void setArch(String arch) { this.arch = arch; } public void setOs(String os) { this.os = os; } public String toString() { return os + "_" + arch; } }

Consulte a continuación los enlaces

  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