package com.github.signed.sandbox.multiinput; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class ClassPathLibraryLoader { private static final String[] HID_LIB_NAMES = { "/native/linux/libhidapi-jni-64.so", "/native/linux/libhidapi-jni-32.so", "/native/mac/libhidapi-jni-64.jnilib", "/native/mac/libhidapi-jni-32.jnilib", "/native/win/hidapi-jni-64.dll", "/native/win/hidapi-jni-32.dll" }; public static boolean loadNativeHIDLibrary() { boolean isHIDLibLoaded = false; for(String path : HID_LIB_NAMES) { isHIDLibLoaded = loadLibrary(path); if (isHIDLibLoaded) { break; } } return isHIDLibLoaded; } public static void loadLinux32Bit(){ loadLibrary("/native/linux/libhidapi-jni-32.so"); } public static void loadLinux64Bit(){ loadLibrary("/native/linux/libhidapi-jni-64.so"); } private static boolean loadLibrary(String path) { try { File fileOut = moveNativeLibrary(path); Runtime.getRuntime().load(fileOut.toString()); return true; } catch (Exception e) { return false; } } private static File moveNativeLibrary(String path) throws IOException { InputStream in = ClassPathLibraryLoader.class.getResourceAsStream(path); if (in != null) { try { // always write to different location String tempName = path.substring(path.lastIndexOf('/') + 1); File fileOut = File.createTempFile(tempName.substring(0, tempName.lastIndexOf('.')), tempName.substring(tempName.lastIndexOf('.'), tempName.length())); fileOut.deleteOnExit(); OutputStream out = new FileOutputStream(fileOut); byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0){ out.write(buf, 0, len); } out.close(); return fileOut; } finally { in.close(); } } throw new RuntimeException("could not move native library"); } }