大家好,
我想通过JNR-FFI从Clojure调用C库中的原生函数,而不必编写Java代码。
(defproject mypkg
:dependencies [[org.clojure/clojure "1.10.1"]
[com.github.jnr/jnr-ffi "2.2.0"]])
基于这里和这里的jnr-ffi示例,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函数。我该如何 doing
为了避免每次加载库时都重新加载库以调用每个C函数的Clojure包装器函数,我可以编写以下方法
(defn lib (. LibraryLoader load LIBRARY_NAME))
然后访问其中的本地函数?
我既不是C专家也不是Java专家,所以任何指导都非常欢迎。
谢谢。