我有一个JNI库,包括.jar和.so文件。请注意,库是针对Java的,而不是Clojure的。现在,我已经能够在eclipse上使用Java中的库运行代码。
我现在要做的是让库通过Java互操作功能在Clojure上运行。通过创建jar文件,我已经成功地做到了这一点,但是它没有在REPL上工作。
以下是我迄今所做的工作:
此时,当试图从库中使用任何构造函数(或函数)时,我会得到链接器错误:
UnsatisfiedLinkError edu.upc.freeling.freelingJNI.new_Tokenizer(Ljava/lang/String;)J edu.upc.freeling.freelingJNI.new_Tokenizer (freelingJNI.java:-2)请注意,同一行在Java上和使用"lein“生成的Clojure jar中都运行。
我对Clojure还是很陌生的,我不知道可能出了什么问题,看看jar版本是如何运行的。
有什么线索吗?
发布于 2015-10-30 20:54:53
经过进一步的调查,我终于找到了答案。问题是,我使用了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
发布于 2015-10-28 06:08:40
问题是,莱宁根要成功地加载一个库,它必须存在于在线存储库或本地存储库中。您必须使用maven为jar创建一个本地存储库,并在您的project.clj文件中声明:存储库选项。保罗·格罗斯有一个关于如何在他的博客上做这件事的详细教程。
发布于 2015-10-28 08:51:33
有几种方法可以做到这一点。我不认为您需要一个本地存储库--至少当我上次在clojure中使用JNI时,您没有使用JNI(但在clojure 1.3中返回了JNI,自那以后lein也发生了一些变化)。下面的堆栈溢出问题和答案可能会为您提供一些指针
https://stackoverflow.com/questions/33375853
复制相似问题