我有一个JNI库,包括.jar和.so文件。请注意,该库适用于Java,而不是Clojure。现在我已经能够在Eclipse上使用Java运行代码了。
我现在要做的是通过Java互操作功能让库在Clojure上运行。我通过创建一个jar文件成功地做到了这一点,但是它没有在REPL上工作。
这是我到目前为止所做的:
首先,我已经设置了一个leiningen项目,并使用JNI绑定导入了jar,因此我可以正常导入并按预期方式查看库中的类。
然后,我将本机库添加到我的LD_LIBRARY_PATH(该库在Java中运行所必需的),并且即使在REPL上加载它似乎也很好(没有错误)。
< / LI>此时,当尝试从库中使用任何构造函数(或函数)时,我会遇到链接器错误:
UnsatisfiedLinkError edu.upc.freeling.freelingJNI.new_Tokenizer(Ljava/lang/String;)J edu.upc.freeling.freelingJNI.new_Tokenizer (freelingJNI.java:-2)
请注意,同一行在Java和使用“lein uberjar”生成的Clojure jar中运行。
我还是Clojure的新手,我不知道可能出现什么问题,看看jar版本是如何正常运行的。
任何线索?
答案 0 :(得分:0)
问题是,为了使leiningen成功加载库,它必须存在于在线存储库或本地存储库中。您必须使用maven为jar创建本地存储库,并在project.clj文件中声明:repository选项。保罗格罗斯有一个关于如何在blog上进行详细教程的详细教程。
答案 1 :(得分:0)
有几种方法可以做到这一点。我不相信你需要一个本地存储库 - 至少当我上次使用带有clojure的JNI时你并没有这样做(但是那回到了clojure 1.3并且lein从那时起有所改变)。以下堆栈溢出问题和答案可能会给你一些指示
答案 2 :(得分:0)
经过一番调查,我终于找到了答案。问题是我正在使用System / loadLibrary来加载库,这已知在REPL上无法正常工作。正确的方法是使用clojure.lang.RT / loadLibrary,如下所示:
(clojure.lang.RT/loadLibrary "library_name_in_java_library_path")
来源:http://grokbase.com/t/gg/clojure/145dh2amzr/loading-native-libs-from-clojure