| 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; |
| } |
| |
| } |