diff --git a/bindings/java/build-unix.xml b/bindings/java/build-unix.xml index cd0ef4934b8d82b083ce704d08328bc3dcae072e..2230808bdbe46bbfdb4761d5dbb1cc2ac4f3ce5f 100644 --- a/bindings/java/build-unix.xml +++ b/bindings/java/build-unix.xml @@ -42,7 +42,16 @@ <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 --> @@ -51,11 +60,41 @@ <copy file="./jni/.libs/libtsk_jni.so" tofile="./libtsk_jni.so"/> </target> - <target name="copyUnixLibs" depends="testTSKLibs" if="tsk_so.present"> - <!-- does nothing for now --> + <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="copyUnixLibs,copyMacLibs" /> + <target name="copyLibs" depends="copyLinuxLibs,copyMacLibs" /> <target name="copyTSKLibs" depends="copyTskLibs_so,copyTskLibs_dylib"> <!-- depends targets take care of the actual copying since the file differs on OS X and Linux --> diff --git a/bindings/java/build-windows.xml b/bindings/java/build-windows.xml index 0356ce1af60f0e6500020af8da508de5c6390641..7a78fd1cd40bebd1f645a13adae6ea8d8fd45731 100644 --- a/bindings/java/build-windows.xml +++ b/bindings/java/build-windows.xml @@ -98,5 +98,11 @@ <fileset refid="crt32dlls" /> </copy> + <copy todir="${i686}/win" overwrite="true"> + <fileset refid="win32dlls" /> + </copy> + <copy todir="${i686}/win" overwrite="true"> + <fileset refid="crt32dlls" /> + </copy> </target> </project> diff --git a/bindings/java/build.xml b/bindings/java/build.xml index 81c0ddef09f97edb027e45181c4b1acc903e9581..7d1271df6a226a694e59c031b23de3085df92921 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="i686" location="build/NATIVELIBS/i686"/> <property name="crt" location="${basedir}/crt" /> <path id="libraries"> @@ -46,15 +47,24 @@ <mkdir dir="${native-libs}" /> <mkdir dir="${amd64}" /> <mkdir dir="${amd64}/win" /> + <mkdir dir="${amd64}/mac" /> + <mkdir dir="${amd64}/linux" /> <mkdir dir="${x86}" /> <mkdir dir="${x86}/win" /> + <mkdir dir="${x86}/linux" /> <mkdir dir="${x86_64}" /> <mkdir dir="${x86_64}/win" /> <mkdir dir="${x86_64}/mac" /> + <mkdir dir="${x86_64}/linux"/> <mkdir dir="${i386}" /> <mkdir dir="${i386}/win" /> + <mkdir dir="${i386}/linux"/> <mkdir dir="${i586}" /> <mkdir dir="${i586}/win" /> + <mkdir dir="${i586}/linux" /> + <mkdir dir="${i686}"/> + <mkdir dir="${i686}/win"/> + <mkdir dir="${i686}/linux"/> </target> <property name="ivy.install.version" value="2.3.0-rc2" /> diff --git a/bindings/java/src/org/sleuthkit/datamodel/LibraryUtils.java b/bindings/java/src/org/sleuthkit/datamodel/LibraryUtils.java index 6a258015bd226a181cf6b331e96b03fe90ef6648..096c5b866a91c550e6b5ddc7010710070716f94e 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/LibraryUtils.java +++ b/bindings/java/src/org/sleuthkit/datamodel/LibraryUtils.java @@ -44,7 +44,7 @@ public enum Lib { MSVCR ("msvcr100"), ZLIB ("zlib"), LIBEWF ("libewf"), - TSK_JNI ("tsk_jni"); + TSK_JNI ("libtsk_jni"); private final String name; @@ -64,12 +64,10 @@ public String getLibName() { */ public static String getPlatform() { String os = System.getProperty("os.name").toLowerCase(); - if(os.contains("win")) { + if(LibraryUtils.isWindows()) { os = "win"; - } else if(os.contains("mac")) { + } else if(LibraryUtils.isMac()) { os = "mac"; - } else { - os = "unix"; } // os.arch represents the architecture of the JVM, not the os String arch = System.getProperty("os.arch"); @@ -94,21 +92,27 @@ private static boolean isMac() { return System.getProperty("os.name").toLowerCase().contains("mac"); } + /** + * Is the platform Linux? + * + * @return + */ + public static boolean isLinux() { + return System.getProperty("os.name").equals("Linux"); + } + /** * Attempt to extract and load the specified library. * * @param library * @return */ - public static void loadLibrary(Lib library) { + public static boolean loadLibrary(Lib library) { StringBuilder path = new StringBuilder(); path.append("/NATIVELIBS/"); path.append(getPlatform()); String libName = library.getLibName(); - if(library == Lib.TSK_JNI && (isWindows() || isMac())) { - libName = "lib" + libName; - } path.append("/"); path.append(libName); @@ -123,32 +127,36 @@ public static void loadLibrary(Lib library) { } } - if(libraryURL != null) { - // copy library to temp folder and load it - try { - java.io.File libTemp = new java.io.File(System.getProperty("java.io.tmpdir") + libName + libExt); - - if(libTemp.exists()) { - // Delete old file - libTemp.delete(); - } - - InputStream in = libraryURL.openStream(); - OutputStream out = new FileOutputStream(libTemp); - - byte[] buffer = new byte[1024]; - int length; - while((length = in.read(buffer)) > 0) { - out.write(buffer, 0, length); - } - in.close(); - out.close(); - - System.load(libTemp.getAbsolutePath()); - } catch (IOException e) { - // Loading failed. - } + if(libraryURL == null) { + return false; } + + // copy library to temp folder and load it + try { + java.io.File libTemp = new java.io.File(System.getProperty("java.io.tmpdir") + libName + libExt); + + if(libTemp.exists()) { + // Delete old file + libTemp.delete(); + } + + InputStream in = libraryURL.openStream(); + OutputStream out = new FileOutputStream(libTemp); + + byte[] buffer = new byte[1024]; + int length; + while((length = in.read(buffer)) > 0) { + out.write(buffer, 0, length); + } + in.close(); + out.close(); + + System.load(libTemp.getAbsolutePath()); + } catch (IOException e) { + // Loading failed. + return false; + } + return true; } public static Lib[] getCRTLibs() { diff --git a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java index abdfa26d5503e01ef6dfb99ed7aefbd073c3ae3a..7d0708a44fbe7a323fee35b0003f7715c467582a 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java +++ b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitJNI.java @@ -118,6 +118,7 @@ public class SleuthkitJNI { //Linked library loading static { + boolean loaded = false; if (LibraryUtils.isWindows()) { try { // on windows force loading ms crt dependencies first @@ -127,9 +128,13 @@ public class SleuthkitJNI { // We should update this if we officially switch to a new version of CRT/compiler for(LibraryUtils.Lib crt : LibraryUtils.getCRTLibs()) { - LibraryUtils.loadLibrary(crt); + loaded = LibraryUtils.loadLibrary(crt); + if(!loaded) { + System.out.println("SleuthkitJNI: failed to load " + crt.getLibName()); + } else { + System.out.println("SleuthkitJNI: loaded " + crt.getLibName()); + } } - System.out.println("Loaded CRT libraries"); } catch (UnsatisfiedLinkError e1) { System.out.println(e1.toString()); try { @@ -145,8 +150,12 @@ public class SleuthkitJNI { for (LibraryUtils.Lib lib : LibraryUtils.getLibs()) { try { - LibraryUtils.loadLibrary(lib); - System.out.println("SleuthkitJNI: loaded " + lib); + 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()); }