package jogamp.common.os; import java.nio.ByteBuffer; import java.nio.IntBuffer; import java.nio.ShortBuffer; import java.security.AccessController; import java.security.PrivilegedAction; import com.jogamp.common.nio.Buffers; import com.jogamp.common.os.AndroidVersion; import com.jogamp.common.os.Platform; import com.jogamp.common.os.Platform.ABIType; import com.jogamp.common.os.Platform.CPUFamily; import com.jogamp.common.os.Platform.CPUType; import com.jogamp.common.os.Platform.OSType; import com.jogamp.common.util.VersionNumber; /** * Abstract parent class of {@link Platform} initializing and holding * platform information, which are initialized independent * of other classes. *

* This class is not intended to be exposed in the public namespace * and solely exist to solve initialization interdependencies.
* Please use {@link Platform} to access the public fields! *

*/ public abstract class PlatformPropsImpl { // // static initialization order: // /** Version 1.6. As a JVM version, it enables certain JVM 1. features. */ public static final VersionNumber Version16; public static final String OS; public static final String OS_lower; public static final String OS_VERSION; public static final VersionNumber OS_VERSION_NUMBER; public static final String ARCH; public static final String ARCH_lower; public static final String JAVA_VENDOR; public static final String JAVA_VENDOR_URL; public static final String JAVA_VERSION; public static final VersionNumber JAVA_VERSION_NUMBER; public static final String JAVA_VM_NAME; public static final String JAVA_RUNTIME_NAME; /** True if having {@link java.nio.LongBuffer} and {@link java.nio.DoubleBuffer} available. */ public static final boolean JAVA_SE; /** True if being compatible w/ language level 6, e.g. JRE 1.6. Implies {@link #JAVA_SE}. Note: We claim Android is compatible. */ public static final boolean JAVA_6; public static final String NEWLINE; public static final boolean LITTLE_ENDIAN; public static final CPUType CPU_ARCH; public static final ABIType ABI_TYPE; public static final OSType OS_TYPE; public static final String os_and_arch; static { Version16 = new VersionNumber(1, 6, 0); // We don't seem to need an AccessController.doPrivileged() block // here as these system properties are visible even to unsigned Applets. OS = System.getProperty("os.name"); OS_lower = OS.toLowerCase(); OS_VERSION = System.getProperty("os.version"); OS_VERSION_NUMBER = new VersionNumber(OS_VERSION, "."); ARCH = System.getProperty("os.arch"); ARCH_lower = ARCH.toLowerCase(); JAVA_VENDOR = System.getProperty("java.vendor"); JAVA_VENDOR_URL = System.getProperty("java.vendor.url"); JAVA_VERSION = System.getProperty("java.version"); JAVA_VERSION_NUMBER = new VersionNumber(JAVA_VERSION, "."); JAVA_VM_NAME = System.getProperty("java.vm.name"); JAVA_RUNTIME_NAME = getJavaRuntimeNameImpl(); JAVA_SE = initIsJavaSE(); JAVA_6 = JAVA_SE && ( AndroidVersion.isAvailable || JAVA_VERSION_NUMBER.compareTo(Version16) >= 0 ) ; NEWLINE = System.getProperty("line.separator"); LITTLE_ENDIAN = queryIsLittleEndianImpl(); CPU_ARCH = getCPUTypeImpl(ARCH_lower); ABI_TYPE = guessABITypeImpl(CPU_ARCH); OS_TYPE = getOSTypeImpl(); os_and_arch = getOSAndArch(OS_TYPE, CPU_ARCH, ABI_TYPE); } protected PlatformPropsImpl() {} private static final String getJavaRuntimeNameImpl() { // the fast path, check property Java SE instead of traversing through the ClassLoader return AccessController.doPrivileged(new PrivilegedAction() { public String run() { return System.getProperty("java.runtime.name"); } }); } private static final boolean initIsJavaSE() { if( null != JAVA_RUNTIME_NAME && JAVA_RUNTIME_NAME.indexOf("Java SE") != -1) { return true; } // probe for classes we need on a SE environment try { Class.forName("java.nio.LongBuffer"); Class.forName("java.nio.DoubleBuffer"); return true; } catch(ClassNotFoundException ex) { // continue with Java SE check } return false; } private static final boolean queryIsLittleEndianImpl() { ByteBuffer tst_b = Buffers.newDirectByteBuffer(Buffers.SIZEOF_INT); // 32bit in native order IntBuffer tst_i = tst_b.asIntBuffer(); ShortBuffer tst_s = tst_b.asShortBuffer(); tst_i.put(0, 0x0A0B0C0D); return 0x0C0D == tst_s.get(0); } private static final CPUType getCPUTypeImpl(String archLower) { if( archLower.equals("x86") || archLower.equals("i386") || archLower.equals("i486") || archLower.equals("i586") || archLower.equals("i686") ) { return CPUType.X86_32; } else if( archLower.equals("x86_64") || archLower.equals("amd64") ) { return CPUType.X86_64; } else if( archLower.equals("ia64") ) { return CPUType.IA64; } else if( archLower.equals("arm") ) { return CPUType.ARM; } else if( archLower.equals("armv5l") ) { return CPUType.ARMv5; } else if( archLower.equals("armv6l") ) { return CPUType.ARMv6; } else if( archLower.equals("armv7l") ) { return CPUType.ARMv7; } else if( archLower.equals("sparc") ) { return CPUType.SPARC_32; } else if( archLower.equals("sparcv9") ) { return CPUType.SPARCV9_64; } else if( archLower.equals("pa_risc2.0") ) { return CPUType.PA_RISC2_0; } else if( archLower.equals("ppc") ) { return CPUType.PPC; } else { throw new RuntimeException("Please port CPU detection to your platform (" + OS_lower + "/" + archLower + ")"); } } private static final boolean contains(String data, String[] search) { if(null != data && null != search) { for(int i=0; i= 0) { return true; } } } return false; } private static final ABIType guessABITypeImpl(CPUType cpuType) { if(CPUFamily.ARM != cpuType.family) { return ABIType.GENERIC_ABI; } return AccessController.doPrivileged(new PrivilegedAction() { private final String[] gnueabihf = new String[] { "gnueabihf", "armhf" }; public ABIType run() { if ( contains(System.getProperty("sun.boot.library.path"), gnueabihf) || contains(System.getProperty("java.library.path"), gnueabihf) || contains(System.getProperty("java.home"), gnueabihf) ) { return ABIType.EABI_GNU_ARMHF; } return ABIType.EABI_GNU_ARMEL; } } ); } private static final OSType getOSTypeImpl() throws RuntimeException { if ( AndroidVersion.isAvailable ) { return OSType.ANDROID; } if ( OS_lower.startsWith("linux") ) { return OSType.LINUX; } if ( OS_lower.startsWith("freebsd") ) { return OSType.FREEBSD; } if ( OS_lower.startsWith("android") ) { return OSType.ANDROID; } if ( OS_lower.startsWith("mac os x") || OS_lower.startsWith("darwin") ) { return OSType.MACOS; } if ( OS_lower.startsWith("sunos") ) { return OSType.SUNOS; } if ( OS_lower.startsWith("hp-ux") ) { return OSType.HPUX; } if ( OS_lower.startsWith("windows") ) { return OSType.WINDOWS; } if ( OS_lower.startsWith("kd") ) { return OSType.OPENKODE; } throw new RuntimeException("Please port OS detection to your platform (" + OS_lower + "/" + ARCH_lower + ")"); } /** * kick off static initialization of platform property information */ public static void initSingleton() { } /** * Returns the GlueGen common name for the given OSType and CPUType * as implemented in the build system in 'gluegen-cpptasks-base.xml'.
* * A list of currently supported os.and.arch strings: *
    *
  • freebsd-i586
  • *
  • freebsd-amd64
  • *
  • hpux-hppa
  • *
  • linux-amd64
  • *
  • linux-ia64
  • *
  • linux-i586
  • *
  • linux-armv6
  • *
  • android-armv6
  • *
  • macosx-universal
  • *
  • solaris-sparc
  • *
  • solaris-sparcv9
  • *
  • solaris-amd64
  • *
  • solaris-i586
  • *
  • windows-amd64
  • *
  • windows-i586
  • *
* @return */ public static final String getOSAndArch(OSType osType, CPUType cpuType, ABIType abiType) { String _os_and_arch; switch( cpuType ) { case X86_32: _os_and_arch = "i586"; break; case ARM: _os_and_arch = "armv6"; // TODO: sync with gluegen-cpptasks-base.xml break; case ARMv5: _os_and_arch = "armv6"; break; case ARMv6: _os_and_arch = "armv6"; break; case ARMv7: _os_and_arch = "armv6"; break; case SPARC_32: _os_and_arch = "sparc"; break; case PPC: _os_and_arch = "ppc"; // TODO: sync with gluegen-cpptasks-base.xml break; case X86_64: _os_and_arch = "amd64"; break; case IA64: _os_and_arch = "ia64"; break; case SPARCV9_64: _os_and_arch = "sparcv9"; break; case PA_RISC2_0: _os_and_arch = "risc2.0"; // TODO: sync with gluegen-cpptasks-base.xml break; default: throw new InternalError("Complete case block"); } if( ABIType.EABI_GNU_ARMHF == abiType ) { _os_and_arch = _os_and_arch + "hf" ; } switch( osType ) { case ANDROID: _os_and_arch = "android-" + _os_and_arch; break; case MACOS: _os_and_arch = "macosx-universal"; break; case WINDOWS: _os_and_arch = "windows-" + _os_and_arch; break; case OPENKODE: _os_and_arch = "openkode-" + _os_and_arch; // TODO: think about that break; case LINUX: _os_and_arch = "linux-" + _os_and_arch; break; case FREEBSD: _os_and_arch = "freebsd-" + _os_and_arch; break; case SUNOS: _os_and_arch = "solaris-" + _os_and_arch; break; case HPUX: _os_and_arch = "hpux-hppa"; // TODO: really only hppa ? break; default: throw new InternalError("Complete case block"); } return _os_and_arch; } }