Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JNI库时,Clojure REPL上的链接器错误,但编译的jar上的链接器错误_Java_Clojure_Java Native Interface_Leiningen_Read Eval Print Loop - Fatal编程技术网

Java 使用JNI库时,Clojure REPL上的链接器错误,但编译的jar上的链接器错误

Java 使用JNI库时,Clojure REPL上的链接器错误,但编译的jar上的链接器错误,java,clojure,java-native-interface,leiningen,read-eval-print-loop,Java,Clojure,Java Native Interface,Leiningen,Read Eval Print Loop,我有一个JNI库,包括.jar和.so文件。请注意,该库是针对Java的,而不是Clojure。现在,我已经能够在eclipse上使用Java中的库运行代码 我现在要做的是通过Clojure的Java互操作功能让库在Clojure上运行。我通过创建一个jar文件成功地做到了这一点,但它在REPL上不起作用 以下是我迄今为止所做的工作: 首先,我设置了一个leiningen项目,并导入了带有JNI绑定的jar,这样我就可以按照预期从库中正确导入和查看类 然后,我将本机库添加到我的LD_libra

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

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

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

  • 首先,我设置了一个leiningen项目,并导入了带有JNI绑定的jar,这样我就可以按照预期从库中正确导入和查看类

  • 然后,我将本机库添加到我的LD_library_路径中(这是该库在Java中运行所必需的),并且即使在REPL上加载它似乎也很好(没有错误)

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

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版本运行得如何


有什么线索吗?

问题是,leiningen要成功加载库,它必须存在于在线存储库或本地存储库中。您必须使用maven为jar创建一个本地存储库,并在project.clj文件中声明:repository选项。保罗·格罗斯(Paul Gross)有一个关于如何在他的计算机上实现这一点的详细教程。

问题是,leiningen要成功加载库,它必须存在于在线存储库或本地存储库中。您必须使用maven为jar创建一个本地存储库,并在project.clj文件中声明:repository选项。保罗·格罗斯(Paul Gross)在他的电脑上有一个详细的教程,教你如何做。

有几种方法可以做到这一点。我不认为您需要本地存储库——至少在我上次将JNI与clojure一起使用时您不需要(但那是在Clojure1.3中使用的,从那时起lein已经有了一些变化)。下面的堆栈溢出问题和答案可能会给您一些提示


有几种方法可以做到这一点。我不认为您需要本地存储库——至少在我上次将JNI与clojure一起使用时您不需要(但那是在Clojure1.3中使用的,从那时起lein已经有了一些变化)。下面的堆栈溢出问题和答案可能会给您一些提示


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

(clojure.lang.RT/loadLibrary "library_name_in_java_library_path")

资料来源:

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

(clojure.lang.RT/loadLibrary "library_name_in_java_library_path")

来源:

谢谢你的回答,但我恐怕我已经按照你在提问前提到的博客中的步骤做了同样的事情。问题最终碰巧是另外一回事。不过,这可能会帮助那些可能会对Clojure中的本机库导入感到困惑的未来读者。谢谢您的回答,但我恐怕我已经按照您在提问之前提到的博客中的步骤做了同样的事情。问题最终碰巧是另外一回事。不过,这可能会帮助那些可能会对Clojure中的本机库导入感到困惑的未来读者。谢谢,我更好地理解了如何将本机依赖项添加到生成的jar中。在我的例子中,依赖项假设是在外部安装的,而不是与应用程序捆绑在一起(jar只是JNI绑定)。真正的问题恰好是我的答案中的内容。谢谢,我更好地理解了如何将本机依赖项添加到生成的jar中。在我的例子中,依赖项假设是在外部安装的,而不是与应用程序捆绑在一起(jar只是JNI绑定)。真正的问题恰好是我的答案。