diff --git a/bindings/java/build-unix.xml b/bindings/java/build-unix.xml index 2230808bdbe46bbfdb4761d5dbb1cc2ac4f3ce5f..7e9cab9d6cfff023a0d688342d59a81de32d9ba9 100644 --- a/bindings/java/build-unix.xml +++ b/bindings/java/build-unix.xml @@ -42,16 +42,10 @@ <property environment="env"/> <property name="jni.dylib" location="${basedir}/jni/.libs/libtsk_jni.dylib" /> <property name="jni.jnilib" value="libtsk_jni.jnilib" /> - <property name="mac.zlib" location="/usr/lib/libz.dylib"/> - <property name="mac.libewf" location="${env.LIBEWF_HOME}/libewf/.libs/libewf.dylib"/> <!-- x86_64 --> <copy file="${jni.dylib}" tofile="${x86_64}/mac/${jni.jnilib}"/> - <copy file="${mac.libewf}" tofile="${x86_64}/mac/libewf.dylib"/> - <copy file="${mac.zlib}" tofile="${x86_64}/mac/zlib.dylib"/> <!-- amd64 --> <copy file="${jni.dylib}" tofile="${amd64}/mac/${jni.jnilib}"/> - <copy file="${mac.libewf}" tofile="${amd64}/mac/libewf.dylib"/> - <copy file="${mac.zlib}" tofile="${amd64}/mac/zlib.dylib"/> </target> <!-- Non-OS X --> @@ -63,35 +57,18 @@ <target name="copyLinuxLibs" depends="testTSKLibs" if="tsk_so.present"> <property environment="env"/> <property name="jni.so" location="${basedir}/jni/.libs/libtsk_jni.so" /> - <!-- check that this location is correct --> - <property name="linux.zlib" location="/usr/lib/libz.so"/> - <property name="zlib.so" value="zlib.so"/> - <property name="linux.libewf" location="${env.LIBEWF_HOME}/libewf/.libs/libewf.so"/> - <property name="libewf.so" value="libewf.so"/> <!-- x86_64 --> <copy file="${jni.so}" tofile="${x86_64}/linux/libtsk_jni.so"/> - <copy file="${linux.zlib}" tofile="${x86_64}/linux/${zlib.so}"/> - <copy file="${linux.libewf}" tofile="${x86_64}/linux/${libewf.so}"/> <!-- amd64 --> <copy file="${jni.so}" tofile="${amd64}/linux/libtsk_jni.so"/> - <copy file="${linux.zlib}" tofile="${amd64}/linux/${zlib.so}"/> - <copy file="${linux.libewf}" tofile="${amd64}/linux/${libewf.so}"/> <!-- x86 --> <copy file="${jni.so}" tofile="${x86}/linux/libtsk_jni.so"/> - <copy file="${linux.zlib}" tofile="${x86}/linux/${zlib.so}"/> - <copy file="${linux.libewf}" tofile="${x86}/linux/${libewf.so}"/> <!-- i386 --> <copy file="${jni.so}" tofile="${i386}/linux/libtsk_jni.so"/> - <copy file="${linux.zlib}" tofile="${i386}/linux/${zlib.so}"/> - <copy file="${linux.libewf}" tofile="${i386}/linux/${libewf.so}"/> <!-- i586 --> <copy file="${jni.so}" tofile="${i586}/linux/libtsk_jni.so"/> - <copy file="${linux.zlib}" tofile="${i586}/linux/${zlib.so}"/> - <copy file="${linux.libewf}" tofile="${i586}/linux/${libewf.so}"/> <!-- i686 --> <copy file="${jni.so}" tofile="${i686}/linux/libtsk_jni.so"/> - <copy file="${linux.zlib}" tofile="${i686}/linux/${zlib.so}"/> - <copy file="${linux.libewf}" tofile="${i686}/linux/${libewf.so}"/> </target> <target name="copyLibs" depends="copyLinuxLibs,copyMacLibs" /> diff --git a/bindings/java/src/org/sleuthkit/datamodel/LibraryUtils.java b/bindings/java/src/org/sleuthkit/datamodel/LibraryUtils.java index 096c5b866a91c550e6b5ddc7010710070716f94e..502fb99025ae524af6a6e908581c4fb38e979c08 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/LibraryUtils.java +++ b/bindings/java/src/org/sleuthkit/datamodel/LibraryUtils.java @@ -23,6 +23,8 @@ import java.io.InputStream; import java.io.OutputStream; import java.net.URL; +import java.util.Arrays; +import java.util.List; /** * Collection of methods to load libraries embedded in the TSK Datamodel Jar file. @@ -35,34 +37,113 @@ public class LibraryUtils { 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 }; + public static final Lib[] OTHER_LIBS = new Lib[] { Lib.ZLIB, Lib.LIBEWF }; /** * The libraries the TSK Datamodel needs. */ public enum Lib { - MSVCP ("msvcp100"), - MSVCR ("msvcr100"), - ZLIB ("zlib"), - LIBEWF ("libewf"), - TSK_JNI ("libtsk_jni"); + MSVCP ("msvcp100", ""), + MSVCR ("msvcr100", ""), + ZLIB ("zlib", "z"), + LIBEWF ("libewf", "ewf"), + TSK_JNI ("libtsk_jni", "tsk_jni"); private final String name; + private final String unixName; - Lib(String name) { + Lib(String name, String unixName) { this.name = name; + this.unixName = unixName; } public String getLibName() { return this.name; } + + public String getUnixName() { + return this.unixName; + } } + /** + * Load all libraries needed for the current platform except the TSK JNI. + * + * @return + */ + public static boolean loadAuxilliaryLibs() { + boolean loaded = true; + 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 + for(LibraryUtils.Lib crt : LibraryUtils.getCRTLibs()) { + loaded = LibraryUtils.loadLibFromJar(crt); + if(!loaded) { + System.out.println("SleuthkitJNI: failed to load " + crt.getLibName()); + } else { + System.out.println("SleuthkitJNI: loaded " + crt.getLibName()); + } + } + } 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"); + loaded = true; + } catch (UnsatisfiedLinkError e2) { + System.out.println("SleuthkitJNI: error loading CRT libraries, " + e2.toString()); + loaded = false; + } + } + + for(LibraryUtils.Lib lib : LibraryUtils.getLibs()) { + loaded = LibraryUtils.loadLibFromJar(lib); + if (!loaded) { + System.out.println("SleuthkitJNI: failed to load " + lib.getLibName()); + } else { + System.out.println("SleuthkitJNI: loaded " + lib.getLibName()); + } + } + } else { + // Unix platform + for (Lib lib : LibraryUtils.getLibs()) { + try { + System.loadLibrary(lib.getUnixName()); + System.out.println("SleuthkitJNI: loaded " + lib.getLibName()); + } catch (UnsatisfiedLinkError e) { + loaded = false; + System.out.println("SleuthkitJNI: failed to load " + lib.getLibName()); + } + } + } + return loaded; + } + + /** + * Load the Sleuthkit JNI. + * + * @return + */ + public static boolean loadSleuthkitJNI() { + boolean loaded = LibraryUtils.loadLibFromJar(Lib.TSK_JNI); + if (!loaded) { + System.out.println("SleuthkitJNI: failed to load " + Lib.TSK_JNI.getLibName()); + } else { + System.out.println("SleuthkitJNI: loaded " + Lib.TSK_JNI.getLibName()); + } + return loaded; + } /** * Get the name of the current platform. * * @return a platform identifier, formatted as "OS_ARCH/OS_NAME" */ - public static String getPlatform() { + private static String getPlatform() { String os = System.getProperty("os.name").toLowerCase(); if(LibraryUtils.isWindows()) { os = "win"; @@ -79,7 +160,7 @@ public static String getPlatform() { * * @return */ - public static boolean isWindows() { + private static boolean isWindows() { return System.getProperty("os.name").toLowerCase().contains("windows"); } @@ -97,7 +178,7 @@ private static boolean isMac() { * * @return */ - public static boolean isLinux() { + private static boolean isLinux() { return System.getProperty("os.name").equals("Linux"); } @@ -107,7 +188,7 @@ public static boolean isLinux() { * @param library * @return */ - public static boolean loadLibrary(Lib library) { + private static boolean loadLibFromJar(Lib library) { StringBuilder path = new StringBuilder(); path.append("/NATIVELIBS/"); path.append(getPlatform()); @@ -159,11 +240,11 @@ public static boolean loadLibrary(Lib library) { return true; } - public static Lib[] getCRTLibs() { + private static Lib[] getCRTLibs() { return CRT_LIBS; } - public static Lib[] getLibs() { + private 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 7d0708a44fbe7a323fee35b0003f7715c467582a..2d75ca64b1d27b8f81a40fdd461f3854154e284f 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java +++ b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java @@ -118,49 +118,8 @@ public class SleuthkitJNI { //Linked library loading static { - boolean loaded = false; - 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 - - for(LibraryUtils.Lib crt : LibraryUtils.getCRTLibs()) { - loaded = LibraryUtils.loadLibrary(crt); - if(!loaded) { - System.out.println("SleuthkitJNI: failed to load " + crt.getLibName()); - } else { - System.out.println("SleuthkitJNI: loaded " + crt.getLibName()); - } - } - } 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.getLibs()) { - try { - loaded = LibraryUtils.loadLibrary(lib); - if(loaded) { - System.out.println("SleuthkitJNI: loaded " + lib); - } else { - System.out.println("SleuthkitJNI: failed to load " + lib); - } - } catch (UnsatisfiedLinkError e) { - System.out.println("SleuthkitJNI: error loading " + lib + "library, " + e.toString()); - } - } - + LibraryUtils.loadAuxilliaryLibs(); + LibraryUtils.loadSleuthkitJNI(); } public SleuthkitJNI() {