Problem
Nie mogę wczytać i wywołać metod w skompilowanej klasie c do projektu leiningen. Moje podstawowe podejście polega na załadowaniu klasy Java, JavaWrapper.java, która używa JNI do wywoływania niektórych metod natywnych w kodzie rodzimym, wrapper.o, a następnie wywoływania metod za pośrednictwem tej klasy pakowania java.
Wyobrażam sobie, że są problemy z klasą ładującą ładowanie klasy java, która ładuje kod natywny z projektu clojure, ale biorąc pod uwagę, że nie mogę bezpośrednio uzyskać kodu clojure, aby znaleźć plik wrapper.o na ścieżce biblioteki, jestem nie wiem, jak sobie z tym poradzić.Jak załadować i używać natywnego kodu c w projekcie lein?
plik projektu 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
)
plik clojure metodą głównej
Próbowałem to lekko zmodyfikowany z czterech podejść, wszystko wliczone w kodzie poniżej wraz z odpowiednimi błędu w komentarzach.
(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
)
kod Java z rodzimych metod, które wykorzystuje JNI, JavaWrapper.java
public class JavaWrapper{
public native void setup();
public static void load(String lib){ System.load(lib);}
}
Przed próbuje uzyskać to do pracy z Clojure i Lein Zrobiłem powodzeniem ładować i używać rodzimych metod w wrapper.o przez JavaWrapper i JNI.
prawdopodobnie związane:
jestem też w stanie załadować wrapper.o w JavaWrapper.java poprzez
System.loadLibrary("wrapper.o");
muszę używać
System.load("/absolute/path/to/wrapper.o");
wersje narzędzi
wersja clojure: 1.5.1
wersja lein: 2.3.4
JDK: 1.7
os: debian7
Lepsze zrozumienie ClassLoaders lub zwłaszcza pracujących prostym przykładzie byłby bardzo przydatny, dzięki.