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 @@
<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 -->
......
......@@ -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>
......@@ -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" />
......
......@@ -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() {
......
......@@ -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());
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment