package org.clearsilver; /** * Loads the ClearSilver JNI library. * * <p>By default, it attempts to load the library 'clearsilver-jni' from the * path specified in the 'java.library.path' system property.</p> * * <p>If this fails, the JVM exits with a code of 1. However, this strategy * can be changed using {@link #setFailureCallback(Runnable)}.</p> */ public class JNI { /** * Failure callback strategy that writes a message to sysout, then calls * System.exit(1). */ public static Runnable EXIT_JVM = new Runnable() { public void run() { System.out.println("Could not load '" + libraryName + "'"); System.out.println("java.library.path = " + System.getProperty("java.library.path")); System.exit(1); } }; /** * Failure callback strategy that throws an UnsatisfiedLinkError, which * should be caught be client code. */ public static Runnable THROW_ERROR = new Runnable() { public void run() { throw new UnsatisfiedLinkError("Could not load '" + libraryName + "'"); } }; private static Runnable failureCallback = EXIT_JVM; private static Object callbackLock = new Object(); private static String libraryName = "clearsilver-jni"; /** * Attempts to load the ClearSilver JNI library. * * @see #setFailureCallback(Runnable) */ public static void loadLibrary() { try { System.loadLibrary(libraryName); } catch (UnsatisfiedLinkError e) { synchronized (callbackLock) { if (failureCallback != null) { failureCallback.run(); } } } } /** * Sets a callback for what should happen if the JNI library cannot * be loaded. The default is {@link #EXIT_JVM}. * * @see #EXIT_JVM * @see #THROW_ERROR */ public static void setFailureCallback(Runnable failureCallback) { synchronized(callbackLock) { JNI.failureCallback = failureCallback; } } /** * Set name of JNI library to load. Default is 'clearsilver-jni'. */ public static void setLibraryName(String libraryName) { JNI.libraryName = libraryName; } }