2015-10-27 2 views
1

У меня есть библиотека JNI, как .jar, так и .so. Обратите внимание: библиотека предназначена для Java, а не Clojure. Прямо сейчас я смог запустить код, используя библиотеку в Java, на eclipse.Ошибка компоновщика на Clojure REPL, но не на скомпилированном банке при использовании библиотеки JNI

То, что я пытаюсь сделать сейчас, это заставить библиотеку работать на Clojure с помощью возможностей взаимодействия с Java. Мне это удалось, создав файл jar, но он не работает с REPL.

Вот что я сделал до сих пор:

  • Во-первых, я создал проект Leiningen и импортировали банку с креплениями JNI, чтобы я мог правильно импортировать и видеть классы из библиотеки как и ожидалось.

  • Затем я добавил родную библиотеку в свой 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 и в банке Clojure, созданной с помощью «lein uberjar».

Я по-прежнему новичок в Clojure, и я не знаю, что может быть неправильным, если посмотреть, как работает версия jar.

Любые подсказки?

ответ

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

0

Проблема заключается в том, что для leiningen для успешной загрузки библиотеки она должна существовать в онлайн-репозитории или локальном репозитории. Вам нужно будет создать локальный репозиторий для jar с помощью maven и объявить опцию: repository в файле project.clj. Пол Гросс имеет подробный учебник о том, как это сделать на своем blog.

+0

Спасибо за ваш ответ, но я боюсь, что я уже сделал это точная вещь, следуя шаги из блога, который вы упоминаете, прежде чем спрашивать. В конце концов, проблема была чем-то другим. Тем не менее, это может помочь будущим читателям, которые могут быть смущены импортом корневой библиотеки в Clojure. – Setzer22

0

Существует несколько способов сделать это. Я не считаю, что вам нужен локальный репозиторий - по крайней мере, вы этого не сделали, когда я в последний раз использовал JNI с clojure (но это было снова с clojure 1.3, и лейн немного изменился с тех пор). Следующий вопрос переполнения стека и ответ может дать вам некоторые указатели

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

+0

Спасибо, я получил лучшее понимание того, как вы можете добавить свои собственные зависимости к сгенерированной банке. В моем случае предполагается, что зависимости были установлены извне, а не в комплекте с приложением (банкой были только привязки JNI). Реальная проблема оказалась в моем ответе. – Setzer22

 Смежные вопросы

  • Нет связанных вопросов^_^