Skip to content
Snippets Groups Projects
Commit eeba90bf authored by Brian Carrier's avatar Brian Carrier
Browse files

Merge pull request #217 from jawallace/unixJNIFix

Added fix so libraries are copied and loaded correctly on unix platforms
parents ed98de1f 5c179a8f
No related branches found
No related tags found
No related merge requests found
...@@ -42,7 +42,16 @@ ...@@ -42,7 +42,16 @@
<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 -->
<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 -->
<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 -->
...@@ -51,11 +60,41 @@ ...@@ -51,11 +60,41 @@
<copy file="./jni/.libs/libtsk_jni.so" tofile="./libtsk_jni.so"/> <copy file="./jni/.libs/libtsk_jni.so" tofile="./libtsk_jni.so"/>
</target> </target>
<target name="copyUnixLibs" depends="testTSKLibs" if="tsk_so.present"> <target name="copyLinuxLibs" depends="testTSKLibs" if="tsk_so.present">
<!-- does nothing for now --> <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>
<target name="copyLibs" depends="copyUnixLibs,copyMacLibs" /> <target name="copyLibs" depends="copyLinuxLibs,copyMacLibs" />
<target name="copyTSKLibs" depends="copyTskLibs_so,copyTskLibs_dylib"> <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 --> <!-- depends targets take care of the actual copying since the file differs on OS X and Linux -->
......
...@@ -98,5 +98,11 @@ ...@@ -98,5 +98,11 @@
<fileset refid="crt32dlls" /> <fileset refid="crt32dlls" />
</copy> </copy>
<copy todir="${i686}/win" overwrite="true">
<fileset refid="win32dlls" />
</copy>
<copy todir="${i686}/win" overwrite="true">
<fileset refid="crt32dlls" />
</copy>
</target> </target>
</project> </project>
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
<property name="x86_64" location="build/NATIVELIBS/x86_64" /> <property name="x86_64" location="build/NATIVELIBS/x86_64" />
<property name="i386" location="build/NATIVELIBS/i386" /> <property name="i386" location="build/NATIVELIBS/i386" />
<property name="i586" location="build/NATIVELIBS/i586" /> <property name="i586" location="build/NATIVELIBS/i586" />
<property name="i686" location="build/NATIVELIBS/i686"/>
<property name="crt" location="${basedir}/crt" /> <property name="crt" location="${basedir}/crt" />
<path id="libraries"> <path id="libraries">
...@@ -46,15 +47,24 @@ ...@@ -46,15 +47,24 @@
<mkdir dir="${native-libs}" /> <mkdir dir="${native-libs}" />
<mkdir dir="${amd64}" /> <mkdir dir="${amd64}" />
<mkdir dir="${amd64}/win" /> <mkdir dir="${amd64}/win" />
<mkdir dir="${amd64}/mac" />
<mkdir dir="${amd64}/linux" />
<mkdir dir="${x86}" /> <mkdir dir="${x86}" />
<mkdir dir="${x86}/win" /> <mkdir dir="${x86}/win" />
<mkdir dir="${x86}/linux" />
<mkdir dir="${x86_64}" /> <mkdir dir="${x86_64}" />
<mkdir dir="${x86_64}/win" /> <mkdir dir="${x86_64}/win" />
<mkdir dir="${x86_64}/mac" /> <mkdir dir="${x86_64}/mac" />
<mkdir dir="${x86_64}/linux"/>
<mkdir dir="${i386}" /> <mkdir dir="${i386}" />
<mkdir dir="${i386}/win" /> <mkdir dir="${i386}/win" />
<mkdir dir="${i386}/linux"/>
<mkdir dir="${i586}" /> <mkdir dir="${i586}" />
<mkdir dir="${i586}/win" /> <mkdir dir="${i586}/win" />
<mkdir dir="${i586}/linux" />
<mkdir dir="${i686}"/>
<mkdir dir="${i686}/win"/>
<mkdir dir="${i686}/linux"/>
</target> </target>
<property name="ivy.install.version" value="2.3.0-rc2" /> <property name="ivy.install.version" value="2.3.0-rc2" />
......
...@@ -44,7 +44,7 @@ public enum Lib { ...@@ -44,7 +44,7 @@ public enum Lib {
MSVCR ("msvcr100"), MSVCR ("msvcr100"),
ZLIB ("zlib"), ZLIB ("zlib"),
LIBEWF ("libewf"), LIBEWF ("libewf"),
TSK_JNI ("tsk_jni"); TSK_JNI ("libtsk_jni");
private final String name; private final String name;
...@@ -64,12 +64,10 @@ public String getLibName() { ...@@ -64,12 +64,10 @@ public String getLibName() {
*/ */
public static String getPlatform() { public static String getPlatform() {
String os = System.getProperty("os.name").toLowerCase(); String os = System.getProperty("os.name").toLowerCase();
if(os.contains("win")) { if(LibraryUtils.isWindows()) {
os = "win"; os = "win";
} else if(os.contains("mac")) { } else if(LibraryUtils.isMac()) {
os = "mac"; os = "mac";
} else {
os = "unix";
} }
// os.arch represents the architecture of the JVM, not the os // os.arch represents the architecture of the JVM, not the os
String arch = System.getProperty("os.arch"); String arch = System.getProperty("os.arch");
...@@ -94,21 +92,27 @@ private static boolean isMac() { ...@@ -94,21 +92,27 @@ private static boolean isMac() {
return System.getProperty("os.name").toLowerCase().contains("mac"); 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. * Attempt to extract and load the specified library.
* *
* @param library * @param library
* @return * @return
*/ */
public static void loadLibrary(Lib library) { public static boolean loadLibrary(Lib library) {
StringBuilder path = new StringBuilder(); StringBuilder path = new StringBuilder();
path.append("/NATIVELIBS/"); path.append("/NATIVELIBS/");
path.append(getPlatform()); path.append(getPlatform());
String libName = library.getLibName(); String libName = library.getLibName();
if(library == Lib.TSK_JNI && (isWindows() || isMac())) {
libName = "lib" + libName;
}
path.append("/"); path.append("/");
path.append(libName); path.append(libName);
...@@ -123,32 +127,36 @@ public static void loadLibrary(Lib library) { ...@@ -123,32 +127,36 @@ public static void loadLibrary(Lib library) {
} }
} }
if(libraryURL != null) { if(libraryURL == null) {
// copy library to temp folder and load it return false;
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.
}
} }
// 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() { public static Lib[] getCRTLibs() {
......
...@@ -118,6 +118,7 @@ public class SleuthkitJNI { ...@@ -118,6 +118,7 @@ public class SleuthkitJNI {
//Linked library loading //Linked library loading
static { static {
boolean loaded = false;
if (LibraryUtils.isWindows()) { if (LibraryUtils.isWindows()) {
try { try {
// on windows force loading ms crt dependencies first // on windows force loading ms crt dependencies first
...@@ -127,9 +128,13 @@ public class SleuthkitJNI { ...@@ -127,9 +128,13 @@ public class SleuthkitJNI {
// We should update this if we officially switch to a new version of CRT/compiler // We should update this if we officially switch to a new version of CRT/compiler
for(LibraryUtils.Lib crt : LibraryUtils.getCRTLibs()) { 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) { } catch (UnsatisfiedLinkError e1) {
System.out.println(e1.toString()); System.out.println(e1.toString());
try { try {
...@@ -145,8 +150,12 @@ public class SleuthkitJNI { ...@@ -145,8 +150,12 @@ public class SleuthkitJNI {
for (LibraryUtils.Lib lib : LibraryUtils.getLibs()) { for (LibraryUtils.Lib lib : LibraryUtils.getLibs()) {
try { try {
LibraryUtils.loadLibrary(lib); loaded = LibraryUtils.loadLibrary(lib);
System.out.println("SleuthkitJNI: loaded " + lib); if(loaded) {
System.out.println("SleuthkitJNI: loaded " + lib);
} else {
System.out.println("SleuthkitJNI: failed to load " + lib);
}
} catch (UnsatisfiedLinkError e) { } catch (UnsatisfiedLinkError e) {
System.out.println("SleuthkitJNI: error loading " + lib + "library, " + e.toString()); System.out.println("SleuthkitJNI: error loading " + lib + "library, " + e.toString());
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment