首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用JNI库时,Clojure REPL上的链接器错误,而在已编译的jar上没有链接器错误

使用JNI库时,Clojure REPL上的链接器错误,而在已编译的jar上没有链接器错误
EN

Stack Overflow用户
提问于 2015-10-27 18:30:46
回答 3查看 168关注 0票数 1

我有一个JNI库,包括.jar和.so文件。请注意,库是针对Java的,而不是Clojure的。现在,我已经能够在eclipse上使用Java中的库运行代码。

我现在要做的是让库通过Java互操作功能在Clojure上运行。通过创建jar文件,我已经成功地做到了这一点,但是它没有在REPL上工作。

以下是我迄今所做的工作:

  • 首先,我设置了一个leiningen项目,并使用JNI绑定导入了jar,这样我就可以像预期的那样正确地导入和查看库中的类。
  • 然后,我将本机库添加到我的LD_LIBRARY_PATH中(这是该库在Java中运行所必需的),即使在REPL上加载它似乎也不错(没有错误)。

此时,当试图从库中使用任何构造函数(或函数)时,我会得到链接器错误:

代码语言:javascript
复制
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版本是如何运行的。

有什么线索吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-30 20:54:53

经过进一步的调查,我终于找到了答案。问题是,我使用了System/loadLibrary来加载库,而众所周知,这个库在REPL上不能正常工作。正确的方法是使用clojure.lang.RT/loadLibrary,如下所示:

代码语言:javascript
复制
(clojure.lang.RT/loadLibrary "library_name_in_java_library_path")

来源:http://grokbase.com/t/gg/clojure/145dh2amzr/loading-native-libs-from-clojure

票数 0
EN

Stack Overflow用户

发布于 2015-10-28 06:08:40

问题是,莱宁根要成功地加载一个库,它必须存在于在线存储库或本地存储库中。您必须使用maven为jar创建一个本地存储库,并在您的project.clj文件中声明:存储库选项。保罗·格罗斯有一个关于如何在他的博客上做这件事的详细教程。

票数 0
EN

Stack Overflow用户

发布于 2015-10-28 08:51:33

有几种方法可以做到这一点。我不认为您需要一个本地存储库--至少当我上次在clojure中使用JNI时,您没有使用JNI(但在clojure 1.3中返回了JNI,自那以后lein也发生了一些变化)。下面的堆栈溢出问题和答案可能会为您提供一些指针

bundle-native-jni-shared-libraries-with-clojure-libraries

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33375853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档