Example
To satisfy this Fedora requirement of using "System.load()" instead of "System.loadLibrary()" while still providing 32-bit versus 64-bit usability as well as complying with Java's write-once-run-anywhere goal, most JNI jar file should contain code similar to the following (as used in the pki-symkey JNI package):
static boolean tryLoad(String filename) {
try {
System.load(filename);
} catch (Exception e) {
return false;
} catch (UnsatisfiedLinkError e) {
return false;
}
return true;
}
// Load native library
static {
boolean mNativeLibrariesLoaded = false;
String os = System.getProperty("os.name");
if ((os.equals("Linux"))) {
// Check for 64-bit library availability
// prior to 32-bit library availability.
mNativeLibrariesLoaded =
tryLoad("/usr/lib64/symkey/libsymkey.so");
if (mNativeLibrariesLoaded) {
System.out.println("64-bit symkey library loaded");
} else {
// REMINDER: May be trying to run a 32-bit app
// on 64-bit platform.
mNativeLibrariesLoaded =
tryLoad("/usr/lib/symkey/libsymkey.so");
if (mNativeLibrariesLoaded) {
System.out.println("32-bit symkey library loaded");
} else {
System.out.println("FAILED loading symkey library!");
System.exit(-1);
}
}
} else {
try {
System.loadLibrary("symkey");
System.out.println("symkey library loaded");
mNativeLibrariesLoaded = true;
} catch (Throwable t) {
// This is bad news, the program is doomed at this point
t.printStackTrace();
}
}
}
Packages utilizing approach of bundling so files as resources within JAR files themselves do not have these issues and are more self-contained.
