【发布时间】:2014-06-23 11:58:32
【问题描述】:
问题
我无法将已编译的 c 类中的方法加载和调用到 leiningen 项目中。我的基本方法是加载一个Java类JavaWrapper.java,它使用JNI调用本机代码wrapper.o中的一些本机方法,然后通过这个java包装类调用这些方法。
我想加载一个从 clojure 项目加载本机代码的 java 类时存在 classLoader 问题,但鉴于我似乎无法直接获取 clojure 代码以在库路径上找到 wrapper.o,我我不知道如何处理。
lein 项目文件
(defproject lein-native-test "0.1.0-SNAPSHOT"
...
:java-source-paths ["java-path"]
:jvm-opts ["-Djava.library.path=.:./native:/absolute/path/to/native"] ;;not sure what format it wants
)
带有 main 方法的 clojure 文件
我已经尝试用四种方法对其进行了轻微修改,所有方法都包含在下面的代码中,以及 cmets 中的相应错误。
(ns lein-native-test.core
(:import (com.test JavaWrapper)))
(def -main []
;;four things I've tried and their errors
(clojure.lang.RT.load "/abs/path/to/wrapper.o") ;;could not find file /abs/path/wrapper.o_init.class or wrapper.o.clj
(clojure.lang.RT.loadLibrary "wrapper.o") ;;UnsatisfiedLinkError no wrapper.o in java library path
(JavaWrapper/load "/abs/path/to/wrapper.o") ;;UnsatisfiedLinkError com.test.JavaWrapper.setup()
(assembly-load "/abs/path/to/wrapper.o") ;;unable to resolvesymbol: assembly-load
)
具有使用 JNI、JavaWrapper.java 的本机方法的 Java 代码
public class JavaWrapper{
public native void setup();
public static void load(String lib){ System.load(lib);}
}
在尝试让它与 clojure 和 lein 一起工作之前,我确实通过 JavaWrapper 和 JNI 成功加载并使用了 wrapper.o 中的本机方法。
可能相关:
我也无法通过
System.loadLibrary("wrapper.o");
我必须使用
System.load("/absolute/path/to/wrapper.o");
工具版本
clojure 版本:1.5.1
lein 版本:2.3.4
JDK:1.7
操作系统:debian7
更好地理解 ClassLoaders 或者特别是一个工作简单的示例将非常有用,谢谢。
【问题讨论】: