package tk.amberide.ide.os; import java.io.*; import java.net.URL; /** * * @author Tudor */ public final class Natives { private static final boolean DEV = true; private static final String REV = "6"; private static final String NATIVE_DIR = "native/"; private static final String WIN_DIR = NATIVE_DIR + "windows/"; private static final String NIX_DIR = NATIVE_DIR + "linux/"; private static final String MAC_DIR = NATIVE_DIR + "mac/"; private static final String CACHE_DIR = System.getProperty("java.io.tmpdir") + File.separatorChar + "ambercache_1.0.0_" + (DEV ? System.currentTimeMillis() : REV); public static void unpack() { System.setProperty("org.lwjgl.librarypath", CACHE_DIR); String amberOs = ""; boolean is64Bit = OS.is64Bit(); switch (OS.getPlatform()) { case WINDOWS: if (is64Bit) { unpack(WIN_DIR + "OpenAL64.dll"); unpack(WIN_DIR + "lwjgl64.dll"); } else { unpack(WIN_DIR + "OpenAL32.dll"); unpack(WIN_DIR + "lwjgl.dll"); unpack(WIN_DIR + (amberOs = "amberos32.dll")); } break; case LINUX: if (is64Bit) { unpack(NIX_DIR + "libopenal64.so"); unpack(NIX_DIR + "liblwjgl64.so"); } else { unpack(NIX_DIR + "libopenal.so"); unpack(NIX_DIR + "liblwjgl.so"); } break; case MAC: unpack(MAC_DIR + "liblwjgl.jnilib"); unpack(MAC_DIR + "libopenal.dylib"); break; default: throw new UnsupportedOperationException("unsupported platform"); } if (amberOs.length() > 0) System.setProperty("amber.os.librarypath", CACHE_DIR + File.separator + amberOs); } private static void unpack(String path) { try { URL url = ClassLoader.getSystemResource(path); File pathDir = new File(CACHE_DIR); pathDir.mkdirs(); File libfile = new File(pathDir, path.substring(path.lastIndexOf("/"), path.length())); if (!libfile.exists()) { libfile.deleteOnExit(); InputStream in = url.openStream(); OutputStream out = new BufferedOutputStream(new FileOutputStream(libfile)); int len; byte[] buffer = new byte[8192]; while ((len = in.read(buffer)) > -1) { out.write(buffer, 0, len); } out.flush(); out.close(); in.close(); } } catch (IOException x) { throw new RuntimeException("could not unpack binaries", x); } } }