X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/3a736c9e7ea022b653f0c053e68bad270c2b6d37..dccf1b41e9c7b5a696f01abceaa2779fe65f154f:/src/bindings/java/org/simgrid/NativeLib.java?ds=sidebyside diff --git a/src/bindings/java/org/simgrid/NativeLib.java b/src/bindings/java/org/simgrid/NativeLib.java index 853302bcb7..11578d490b 100644 --- a/src/bindings/java/org/simgrid/NativeLib.java +++ b/src/bindings/java/org/simgrid/NativeLib.java @@ -85,51 +85,45 @@ public final class NativeLib { } /** Try to extract the library from the jarfile before loading it */ - private static boolean loadLibAsStream (String name) throws SecurityException, IOException, UnsatisfiedLinkError { + private static boolean loadLibAsStream (String name) throws IOException, UnsatisfiedLinkError { String path = NativeLib.getPath(); + // We must write the lib onto the disk before loading it -- stupid operating systems + if (tempDir == null) { + tempDir = Files.createTempDirectory("simgrid-java-"); + // don't leak the files on disk, but remove it on JVM shutdown + Runtime.getRuntime().addShutdownHook(new Thread(new FileCleaner(tempDir.toFile()))); + } + /* For each possible filename of the given library on all possible OSes, try it */ for (String filename : new String[] { name, "lib"+name+".so", /* linux */ name+".dll", "lib"+name+".dll", /* windows (pure and mingw) */ "lib"+name+".dylib" /* mac osx */}) { - - InputStream in = NativeLib.class.getClassLoader().getResourceAsStream(path+filename); - if (in == null) - continue; // Try the next name: no such file found - - OutputStream out = null; - try { - // We must write the lib onto the disk before loading it -- stupid operating systems - if (tempDir == null) { - tempDir = Files.createTempDirectory("simgrid-java-"); - // don't leak the files on disk, but remove it on JVM shutdown - Runtime.getRuntime().addShutdownHook(new Thread(new FileCleaner(tempDir.toFile()))); - } - File fileOut = new File(tempDir.toFile().getAbsolutePath() + File.separator + filename); + + File fileOut = new File(tempDir.toFile().getAbsolutePath() + File.separator + filename); + try ( // Try-with-resources. These stream will be autoclosed when needed. + InputStream in = NativeLib.class.getClassLoader().getResourceAsStream(path+filename); + OutputStream out = new FileOutputStream(fileOut); + ) { + if (in == null) + continue; // Try the next name: no such file found /* copy the library in position */ - out = new FileOutputStream(fileOut); byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = in.read(buffer)) != -1) // Read until EOF out.write(buffer, 0, bytesRead); + out.close(); // Windows cannot open it twice, so close it first. Shame. + /* load that shit */ System.load(fileOut.getAbsolutePath()); /* It loaded! we're good */ return true; - } finally { - /* Always close all descriptors, no matter success or error */ - try { - in.close(); - out.close(); - } catch (IOException e) { - /* Too bad. I dont care. */ - } } } @@ -170,12 +164,12 @@ public final class NativeLib { public void run() { try { for (File f : dir.listFiles()) - if (! f.delete() ) - System.err.println("Unable to clean temporary file "+f.getAbsolutePath()+" during shutdown."); - if (! dir.delete() ) - System.err.println("Unable to clean temporary file "+dir.getAbsolutePath()+" during shutdown."); + if (! f.delete() && !f.getAbsolutePath().contains("appveyor")) // Be silent on AppVeyor to not break the tests. Ugly trick :) + System.out.println("Unable to clean temporary file "+f.getAbsolutePath()+" during shutdown."); + if (! dir.delete() && !dir.getAbsolutePath().contains("appveyor") ) + System.out.println("Unable to clean temporary file "+dir.getAbsolutePath()+" during shutdown."); } catch(Exception e) { - System.err.println("Unable to clean temporary file "+dir.getAbsolutePath()+" during shutdown: "+e.getCause()); + System.out.println("Unable to clean temporary file "+dir.getAbsolutePath()+" during shutdown: "+e.getCause()); e.printStackTrace(); } }