簡體   English   中英

使用JNI庫時,在Clojure REPL上出現鏈接器錯誤,但在編譯的jar上則沒有鏈接器錯誤

[英]Linker error on Clojure REPL but not on compiled jar when using a JNI library

我有一個JNI庫,.jar和.so文件。 請注意,該庫適用於Java,而不適用於Clojure。 現在,我已經可以在eclipse上使用Java庫運行代碼。

我現在想做的就是通過Java互操作功能使該庫在Clojure上運行。 通過創建一個jar文件,我已經成功地做到了這一點,但是在REPL上卻無法正常工作。

到目前為止,這是我所做的:

  • 首先,我建立了一個leiningen項目,並用JNI綁定導入了jar,這樣我就可以按預期正確地導入和查看庫中的類了。

  • 然后,我將本機庫添加到我的LD_LIBRARY_PATH(該庫在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)在他的博客上有詳細的教程。

有兩種方法可以做到這一點。 我不相信您需要一個本地存儲庫-至少當我上次將JNI與clojure一起使用時,您並不需要(但是那是在clojure 1.3的支持下,並且lein從那時起有所改變)。 以下堆棧溢出問題和答案可能會給您一些指導

捆綁天然-JNI的共享庫與- Clojure的文庫

經過更多調查后,我終於找到了答案。 問題是我正在使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM