001// Copyright (c) FIRST and other WPILib contributors.
002// Open Source Software; you can modify and/or share it under the terms of
003// the WPILib BSD license file in the root directory of this project.
004
005package edu.wpi.first.hal;
006
007import edu.wpi.first.util.RuntimeLoader;
008import java.io.IOException;
009import java.util.concurrent.atomic.AtomicBoolean;
010
011/** Base class for all JNI wrappers. */
012public class JNIWrapper {
013  static boolean libraryLoaded = false;
014
015  /** Sets whether JNI should be loaded in the static block. */
016  public static class Helper {
017    private static AtomicBoolean extractOnStaticLoad = new AtomicBoolean(true);
018
019    /**
020     * Returns true if the JNI should be loaded in the static block.
021     *
022     * @return True if the JNI should be loaded in the static block.
023     */
024    public static boolean getExtractOnStaticLoad() {
025      return extractOnStaticLoad.get();
026    }
027
028    /**
029     * Sets whether the JNI should be loaded in the static block.
030     *
031     * @param load Whether the JNI should be loaded in the static block.
032     */
033    public static void setExtractOnStaticLoad(boolean load) {
034      extractOnStaticLoad.set(load);
035    }
036
037    /** Utility class. */
038    private Helper() {}
039  }
040
041  static {
042    if (Helper.getExtractOnStaticLoad()) {
043      try {
044        RuntimeLoader.loadLibrary("wpiHaljni");
045      } catch (Exception ex) {
046        ex.printStackTrace();
047        System.exit(1);
048      }
049      libraryLoaded = true;
050    }
051  }
052
053  /**
054   * Force load the library.
055   *
056   * @throws IOException if the library load failed
057   */
058  public static synchronized void forceLoad() throws IOException {
059    if (libraryLoaded) {
060      return;
061    }
062    RuntimeLoader.loadLibrary("wpiHaljni");
063    libraryLoaded = true;
064  }
065
066  /**
067   * Dummy function to suppress unused variable warnings.
068   *
069   * @param object variable to suppress
070   */
071  public static void suppressUnused(Object object) {}
072
073  /** Utility class. */
074  public JNIWrapper() {}
075}