大家好,
我想在不写Java代码的情况下,从Clojure中调用C库中的本地函数。
(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函数。我该如何做到这一点?
为了避免为每个C函数的每个Clojure包装器函数重新加载库,我能写一个像以下这样的方法吗?
(defn lib (. LibraryLoader load LIBRARY_NAME))
然后,我可以通过它访问本地函数?
我既不是C专家也不是Java专家,所以我非常感谢任何指导。
谢谢。