/** Find the nearest enclosing class with native methods. */ static Class<?> findDirectMappedClass(Class<?> cls) { Method[] methods = cls.getDeclaredMethods(); for (Method m : methods) { if ((m.getModifiers() & Modifier.NATIVE) != 0) { return cls; } } int idx = cls.getName().lastIndexOf("$"); if (idx != -1) { String name = cls.getName().substring(0, idx); try { return findDirectMappedClass(Class.forName(name, true, cls.getClassLoader())); } catch(ClassNotFoundException e) { // ignored } } throw new IllegalArgumentException("Can't determine class with native methods from the current context (" + cls + ")"); }
/** * When called from a class static initializer, maps all native methods * found within that class to native libraries via the JNA raw calling * interface. * @param libName library name to which functions should be bound */ public static void register(String libName) { register(findDirectMappedClass(getCallingClass()), libName); }
/** Remove all native mappings for the calling class. Should only be called if the class is no longer referenced and about to be garbage collected. */ public static void unregister() { unregister(findDirectMappedClass(getCallingClass())); }
/** * When called from a class static initializer, maps all native methods * found within that class to native libraries via the JNA raw calling * interface. * @param lib native library to which functions should be bound */ public static void register(NativeLibrary lib) { register(findDirectMappedClass(getCallingClass()), lib); }
/** Find the nearest enclosing class with native methods. */ static Class<?> findDirectMappedClass(Class<?> cls) { Method[] methods = cls.getDeclaredMethods(); for (Method m : methods) { if ((m.getModifiers() & Modifier.NATIVE) != 0) { return cls; } } int idx = cls.getName().lastIndexOf("$"); if (idx != -1) { String name = cls.getName().substring(0, idx); try { return findDirectMappedClass(Class.forName(name, true, cls.getClassLoader())); } catch(ClassNotFoundException e) { // ignored } } throw new IllegalArgumentException("Can't determine class with native methods from the current context (" + cls + ")"); }
/** * When called from a class static initializer, maps all native methods * found within that class to native libraries via the JNA raw calling * interface. * @param libName library name to which functions should be bound */ public static void register(String libName) { register(findDirectMappedClass(getCallingClass()), libName); }
/** Remove all native mappings for the calling class. Should only be called if the class is no longer referenced and about to be garbage collected. */ public static void unregister() { unregister(findDirectMappedClass(getCallingClass())); }
/** * When called from a class static initializer, maps all native methods * found within that class to native libraries via the JNA raw calling * interface. * @param lib native library to which functions should be bound */ public static void register(NativeLibrary lib) { register(findDirectMappedClass(getCallingClass()), lib); }