package uk.co.mmscomputing.util; import java.io.*; import java.net.*; public class JarLib{ static public boolean load(Class cl, String libname){ try{ loadX(cl,libname); return true; }catch(Exception e){ System.out.println("JarLib.load\n\tException = "+e.getMessage()); System.err.println("JarLib.load\n\tException = "+e.getMessage()); e.printStackTrace(); }catch(Error e){ System.out.println("JarLib.load\n\tError = "+e); System.err.println("JarLib.load\n\tError = "+e); e.printStackTrace(); } try{ // Shouldn't really need to load from system defaults anymore System.loadLibrary(libname); System.out.println("JarLib.load: Successfully loaded library ["+libname+"] from some default system folder"); return true; }catch(Exception e){ System.out.println("JarLib.load\n\tException = "+e.getMessage()); System.err.println("JarLib.load\n\tException = "+e.getMessage()); }catch(Error e){ System.out.println("JarLib.load\n\tError = "+e); System.err.println("JarLib.load\n\tError = "+e); e.printStackTrace(); } return false; } static private void loadX(Class cl, String name)throws IOException, UnsatisfiedLinkError{ String libname=System.mapLibraryName(name); URL url = cl.getResource(JarLib.getOsSubDir()+"/"+libname); if(url==null){ throw new UnsatisfiedLinkError(JarLib.class.getName()+".loadX: Could not find library ["+libname+"]"); } try{ URI uri = new URI(url.toString()); String scheme = uri.getScheme(); if(scheme.equals("file")){ // if on local file system use this copy System.load(new File(uri).getAbsolutePath()); System.out.println("JarLib.load: Successfully loaded library ["+url+"] from mmsc standard file location"); }else if( scheme.equals("jar") // make copy in tmp folder on local file system || scheme.equals("nbjcl") // netbeans: 2009-03-05 jmrunge ){ File dir = new File(System.getProperty("java.io.tmpdir"),"mmsc");dir.mkdirs(); File[] files=dir.listFiles(); for(int i=0;i<files.length;i++){ // delete all unused library copies if(files[i].getName().endsWith(libname)){ // if library is still needed we won't be able to delete it files[i].delete(); } } File tmp = File.createTempFile("mmsc",libname,dir); // System.out.println(tmp.getAbsolutePath()); JarLib.extract(tmp,url); System.load(tmp.getAbsolutePath()); System.out.println("JarLib.load: Successfully loaded library ["+url+"] from jar file location"); }else{ throw new UnsatisfiedLinkError(JarLib.class.getName()+".loadX:\n\tUnknown URI-Scheme [+scheme+]; Could not load library ["+uri+"]"); } }catch(URISyntaxException urise){ throw new UnsatisfiedLinkError(JarLib.class.getName()+".loadX:\n\tURI-Syntax Exception; Could not load library ["+url+"]"); } } static private void extract(File fn, URL url)throws IOException{ InputStream in = url.openStream(); FileOutputStream out = new FileOutputStream(fn); byte[] buffer=new byte[4096]; int count=0; while((count=in.read(buffer))>0){ out.write(buffer,0,count); } out.close(); in.close(); } static private String getOsSubDir(){ // This is where I put my stuff // System.err.println("java.library.path = "+System.getProperty("java.library.path")); // System.err.println("os.name = "+System.getProperty("os.name")); // System.err.println("os.arch = "+System.getProperty("os.arch")); String osname=System.getProperty("os.name"); if(osname.startsWith("Linux")){ String osarch=System.getProperty("os.arch"); if(osarch.endsWith("64")){ // amd64 return "lin64"; }else{ // x86 return "lin32"; } } if(osname.startsWith("Windows")){ String osarch=System.getProperty("os.arch"); // System.err.println("osarch = "+osarch); if(osarch.endsWith("64")){ // amd64 return "win64"; }else{ // x86 return "win32"; } } if(osname.startsWith("Mac")){ return "mac";} return ""; } }