diff --git a/bindings/java/build.xml b/bindings/java/build.xml index 309f280b52f26c7ce80a363ece7c2cc8e09e7a1e..d790b070572e3cbd1fcdc68507478555093befbb 100755 --- a/bindings/java/build.xml +++ b/bindings/java/build.xml @@ -26,6 +26,7 @@ <property name="x86_64" location="build/NATIVELIBS/x86_64" /> <property name="i386" location="build/NATIVELIBS/i386" /> <property name="i586" location="build/NATIVELIBS/i586" /> + <property name="crt" location="${basedir}/crt" /> <path id="libraries"> <fileset dir="${lib}"> @@ -131,6 +132,15 @@ pattern="lib/[artifact]-[revision](-[classifier]).[ext]" /> <copy todir="${x86_64}/win"> <fileset refid="win64dlls" /> </copy> + <fileset dir="${crt}/win64" id="crt64dlls"> + <include name="*.dll" /> + </fileset> + <copy todir="${amd64}/win"> + <fileset refid="crt64dlls" /> + </copy> + <copy todir="${x86_64}/win"> + <fileset refid="crt64dlls" /> + </copy> </target> <target name="copyWinLibs32" depends="checkLibDirs" if="win32.exists"> @@ -147,6 +157,18 @@ pattern="lib/[artifact]-[revision](-[classifier]).[ext]" /> <copy todir="${i586}/win"> <fileset refid="win32dlls" /> </copy> + <fileset dir="${crt}/win32" id="crt32dlls"> + <include name="*.dll" /> + </fileset> + <copy todir="${i386}/win"> + <fileset refid="crt32dlls" /> + </copy> + <copy todir="${x86}/win"> + <fileset refid="crt32dlls" /> + </copy> + <copy todir="${i586}/win"> + <fileset refid="crt32dlls" /> + </copy> </target> <target name="jni" depends="compile" description="make the jni.h file"> diff --git a/bindings/java/crt/win32/msvcp100.dll b/bindings/java/crt/win32/msvcp100.dll new file mode 100644 index 0000000000000000000000000000000000000000..8502dfae5e0c30113d03c36cdb8ddaee1dce94c0 Binary files /dev/null and b/bindings/java/crt/win32/msvcp100.dll differ diff --git a/bindings/java/crt/win32/msvcr100.dll b/bindings/java/crt/win32/msvcr100.dll new file mode 100644 index 0000000000000000000000000000000000000000..3e82b1aeace3a21d8b38ff5f6c1c2d8269da4507 Binary files /dev/null and b/bindings/java/crt/win32/msvcr100.dll differ diff --git a/bindings/java/crt/win64/msvcp100.dll b/bindings/java/crt/win64/msvcp100.dll new file mode 100644 index 0000000000000000000000000000000000000000..6f0cdf160a2cc3f8baa12177fe499e328782750e Binary files /dev/null and b/bindings/java/crt/win64/msvcp100.dll differ diff --git a/bindings/java/crt/win64/msvcr100.dll b/bindings/java/crt/win64/msvcr100.dll new file mode 100644 index 0000000000000000000000000000000000000000..b1c3a5e77ccc7dec341d58a796aa379a4aec9517 Binary files /dev/null and b/bindings/java/crt/win64/msvcr100.dll differ diff --git a/bindings/java/src/org/sleuthkit/datamodel/LibraryUtils.java b/bindings/java/src/org/sleuthkit/datamodel/LibraryUtils.java index fadd05dce01c3c9bb3e9737a6227d2faaa831bdd..92588413f5683077f12e15c204610581fbc9b666 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/LibraryUtils.java +++ b/bindings/java/src/org/sleuthkit/datamodel/LibraryUtils.java @@ -9,6 +9,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.net.URL; +import java.nio.file.Files; /** * Collection of methods to load libraries embedded in the TSK Datamodel Jar file. @@ -18,15 +19,22 @@ public class LibraryUtils { public static final String[] EXTS = new String[] { ".so", ".dylib", ".dll", ".jnilib" }; + + public static final Lib[] CRT_LIBS = new Lib[] { Lib.MSVCP, Lib.MSVCR }; + + public static final Lib[] OTHER_LIBS = new Lib[] { Lib.ZLIB, Lib.LIBEWF, Lib.TSK_JNI }; /** * The libraries the TSK Datamodel needs. */ public enum Lib { + MSVCP ("msvcp100"), + MSVCR ("msvcr100"), ZLIB ("zlib"), LIBEWF ("libewf"), TSK_JNI ("tsk_jni"); private final String name; + Lib(String name) { this.name = name; } @@ -52,7 +60,6 @@ public static String getPlatform() { } // os.arch represents the architecture of the JVM, not the os String arch = System.getProperty("os.arch"); - System.out.println(arch.toLowerCase() + "/" + os.toLowerCase()); return arch.toLowerCase() + "/" + os.toLowerCase(); } @@ -66,7 +73,7 @@ public static boolean isWindows() { } /** - * Attempt to load the specified library. + * Attempt to extract and load the specified library. * * @param library * @return @@ -98,7 +105,11 @@ public static void loadLibrary(Lib library) { // copy library to temp folder and load it try { java.io.File libTemp = new java.io.File(System.getProperty("java.io.tmpdir") + libName + libExt); - libTemp.deleteOnExit(); + + if(libTemp.exists()) { + // Delete old file + Files.delete(libTemp.toPath()); + } InputStream in = libraryURL.openStream(); OutputStream out = new FileOutputStream(libTemp); @@ -112,11 +123,17 @@ public static void loadLibrary(Lib library) { out.close(); System.load(libTemp.getAbsolutePath()); - - libTemp.delete(); } catch (IOException e) { // Loading failed. } } + } + + public static Lib[] getCRTLibs() { + return CRT_LIBS; + } + + public static Lib[] getLibs() { + return OTHER_LIBS; } } diff --git a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java index 153c610dcbdaa707b6b93d674183397372ebccf1..73efa23fe2d9f590e0b251669ee2c556f765b950 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java +++ b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java @@ -118,19 +118,31 @@ public class SleuthkitJNI { //Linked library loading static { - try { + if (LibraryUtils.isWindows()) { + try { //on windows force loading ms crt dependencies first //in case linker can't find them on some systems //Note: if shipping with a different CRT version, this will only print a warning //and try to use linker mechanism to find the correct versions of libs. //We should update this if we officially switch to a new version of CRT/compiler - System.loadLibrary("msvcr100"); - System.loadLibrary("msvcp100"); + for(LibraryUtils.Lib crt : LibraryUtils.getCRTLibs()) { + LibraryUtils.loadLibrary(crt); + } System.out.println("Loaded CRT libraries"); - } catch (UnsatisfiedLinkError e) { - System.out.println("Can't find CRT libraries"); + } catch (UnsatisfiedLinkError e1) { + System.out.println(e1.toString()); + try { + // Try to load from system path + System.out.println("Can't find CRT libraries, attempting to load from System.loadLibrary"); + System.loadLibrary("msvcr100"); + System.loadLibrary("msvcp100"); + } catch (UnsatisfiedLinkError e2) { + System.out.println("SleuthkitJNI: error loading CRT libraries, " + e2.toString()); + } } - for(LibraryUtils.Lib lib : LibraryUtils.Lib.values()) { + } + + for(LibraryUtils.Lib lib : LibraryUtils.getLibs()) { try { LibraryUtils.loadLibrary(lib); System.out.println("SleuthkitJNI: loaded " + lib);