大家好,
我想从Clojure中通过JNR-FFI调用C库中的本地函数,而不必编写Java代码。
(defproject mypkg
:dependencies [[org.clojure/clojure "1.10.1"]
[com.github.jnr/jnr-ffi "2.2.0"]])
根据以下示例 这里 和 这里,Java包装器的样子可能如下所示:
package blahblah;
public class BlahNative {
private static int[] intDummy;
private static double[] doubleDummy;
public BlahNative() {
}
public static native void native_a(char var0, char var1, int var2, int var3, int var4, double[] var7, int var8, int var9);
public static native void native_b(char var0, char var1, int var2, int var3, int var4, double[] var7, int var8, int var9);
static {
lib = LibraryLoader
.create(LibSodium.class)
.search("/usr/local/lib")
.search("/opt/local/lib")
.search("/usr/lib")
.search("/lib")
.load(LIBRARY_NAME);
initializeLibrary(lib);
}
}
我认为我的Clojure命名空间应该使用gen-class功能来实现Java类。
(ns mypkg.native
(:import [jnr.ffi LibraryLoader])
(:import [jnr.ffi.annotations IgnoreError])
(:import [jnr.ffi.provider FFIProvider])
(:gen-class))
那么,
如何在Clojure中编写本地方法?换句话说,在使用Clojure的Java互操作特性时,我是否需要指定方法类型(如native
)?
加载了本地库之后,我不知道如何访问库中的C函数。我该怎么办?
为了避免在每次加载Clojure包装器的C函数时重新加载库,我能编写一个类似的方法吗?
(defn lib (. LibraryLoader load LIBRARY_NAME))
然后,访问其中的本地函数?
我既不是C专家也不是Java专家,所以任何指导都将非常感激。
谢谢。