Skip to content
Snippets Groups Projects
Commit c3c60588 authored by Jeff Wallace's avatar Jeff Wallace
Browse files

Merge branch 'unixJNIFix' of https://github.com/jawallace/sleuthkit into unixJNIFix

parents eeba90bf 616c0519
No related branches found
No related tags found
No related merge requests found
...@@ -42,16 +42,10 @@ ...@@ -42,16 +42,10 @@
<property environment="env"/> <property environment="env"/>
<property name="jni.dylib" location="${basedir}/jni/.libs/libtsk_jni.dylib" /> <property name="jni.dylib" location="${basedir}/jni/.libs/libtsk_jni.dylib" />
<property name="jni.jnilib" value="libtsk_jni.jnilib" /> <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 --> <!-- x86_64 -->
<copy file="${jni.dylib}" tofile="${x86_64}/mac/${jni.jnilib}"/> <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 --> <!-- amd64 -->
<copy file="${jni.dylib}" tofile="${amd64}/mac/${jni.jnilib}"/> <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> </target>
<!-- Non-OS X --> <!-- Non-OS X -->
...@@ -63,35 +57,18 @@ ...@@ -63,35 +57,18 @@
<target name="copyLinuxLibs" depends="testTSKLibs" if="tsk_so.present"> <target name="copyLinuxLibs" depends="testTSKLibs" if="tsk_so.present">
<property environment="env"/> <property environment="env"/>
<property name="jni.so" location="${basedir}/jni/.libs/libtsk_jni.so" /> <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 --> <!-- x86_64 -->
<copy file="${jni.so}" tofile="${x86_64}/linux/libtsk_jni.so"/> <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 --> <!-- amd64 -->
<copy file="${jni.so}" tofile="${amd64}/linux/libtsk_jni.so"/> <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 --> <!-- x86 -->
<copy file="${jni.so}" tofile="${x86}/linux/libtsk_jni.so"/> <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 --> <!-- i386 -->
<copy file="${jni.so}" tofile="${i386}/linux/libtsk_jni.so"/> <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 --> <!-- i586 -->
<copy file="${jni.so}" tofile="${i586}/linux/libtsk_jni.so"/> <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 --> <!-- i686 -->
<copy file="${jni.so}" tofile="${i686}/linux/libtsk_jni.so"/> <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>
<target name="copyLibs" depends="copyLinuxLibs,copyMacLibs" /> <target name="copyLibs" depends="copyLinuxLibs,copyMacLibs" />
......
...@@ -23,6 +23,8 @@ ...@@ -23,6 +23,8 @@
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.net.URL; 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. * Collection of methods to load libraries embedded in the TSK Datamodel Jar file.
...@@ -35,34 +37,113 @@ public class LibraryUtils { ...@@ -35,34 +37,113 @@ public class LibraryUtils {
public static final Lib[] CRT_LIBS = new Lib[] { Lib.MSVCP, Lib.MSVCR }; 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. * The libraries the TSK Datamodel needs.
*/ */
public enum Lib { public enum Lib {
MSVCP ("msvcp100"), MSVCP ("msvcp100", ""),
MSVCR ("msvcr100"), MSVCR ("msvcr100", ""),
ZLIB ("zlib"), ZLIB ("zlib", "z"),
LIBEWF ("libewf"), LIBEWF ("libewf", "ewf"),
TSK_JNI ("libtsk_jni"); TSK_JNI ("libtsk_jni", "tsk_jni");
private final String name; private final String name;
private final String unixName;
Lib(String name) { Lib(String name, String unixName) {
this.name = name; this.name = name;
this.unixName = unixName;
} }
public String getLibName() { public String getLibName() {
return this.name; 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. * Get the name of the current platform.
* *
* @return a platform identifier, formatted as "OS_ARCH/OS_NAME" * @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(); String os = System.getProperty("os.name").toLowerCase();
if(LibraryUtils.isWindows()) { if(LibraryUtils.isWindows()) {
os = "win"; os = "win";
...@@ -79,7 +160,7 @@ public static String getPlatform() { ...@@ -79,7 +160,7 @@ public static String getPlatform() {
* *
* @return * @return
*/ */
public static boolean isWindows() { private static boolean isWindows() {
return System.getProperty("os.name").toLowerCase().contains("windows"); return System.getProperty("os.name").toLowerCase().contains("windows");
} }
...@@ -97,7 +178,7 @@ private static boolean isMac() { ...@@ -97,7 +178,7 @@ private static boolean isMac() {
* *
* @return * @return
*/ */
public static boolean isLinux() { private static boolean isLinux() {
return System.getProperty("os.name").equals("Linux"); return System.getProperty("os.name").equals("Linux");
} }
...@@ -107,7 +188,7 @@ public static boolean isLinux() { ...@@ -107,7 +188,7 @@ public static boolean isLinux() {
* @param library * @param library
* @return * @return
*/ */
public static boolean loadLibrary(Lib library) { private static boolean loadLibFromJar(Lib library) {
StringBuilder path = new StringBuilder(); StringBuilder path = new StringBuilder();
path.append("/NATIVELIBS/"); path.append("/NATIVELIBS/");
path.append(getPlatform()); path.append(getPlatform());
...@@ -159,11 +240,11 @@ public static boolean loadLibrary(Lib library) { ...@@ -159,11 +240,11 @@ public static boolean loadLibrary(Lib library) {
return true; return true;
} }
public static Lib[] getCRTLibs() { private static Lib[] getCRTLibs() {
return CRT_LIBS; return CRT_LIBS;
} }
public static Lib[] getLibs() { private static Lib[] getLibs() {
return OTHER_LIBS; return OTHER_LIBS;
} }
} }
...@@ -118,49 +118,8 @@ public class SleuthkitJNI { ...@@ -118,49 +118,8 @@ public class SleuthkitJNI {
//Linked library loading //Linked library loading
static { static {
boolean loaded = false; LibraryUtils.loadAuxilliaryLibs();
if (LibraryUtils.isWindows()) { LibraryUtils.loadSleuthkitJNI();
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());
}
}
} }
public SleuthkitJNI() { public SleuthkitJNI() {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment