2013-09-16 5 views
1

Постановка задачи:

Я желаю, чтобы вызвать функцию QuantLib Java из пространства имен Clojure, следующим образом:Clojure/QuantLib Interop: загрузки классов беды

(Date. 21 Month/September 2013) 

До сих пор, я сделал следующее:

$ brew install boost 
$ brew install quantlib 

Скачан the generated SWIG interfaces.

Создан новый проект Leiningen.

Скопировано сказал интерфейсы в SRC/главная/Java/орг/quantlib/

Добавлено:

:jvm-opts ["-Djava.library.path=src/main/java"] 
:java-source-paths ["src/main/java/"] 

моему project.clj.

Я следил за Bojan Nikolic's instructions on solving a very similar classloading problem, добавляя класс BKLoader.

Когда я загружаю мой core.clj файл в РЕПЛ, я получаю следующее сообщение об ошибке:

UnsatisfiedLinkError org.quantlib.QuantLibJNI.new_Date__SWIG_1(III)J org.quantlib.QuantLibJNI.new_Date__SWIG1 (QuantLibJNI.java:-2) 

Боян Николич a recommendation справиться с этими проблемами, которые загрузки классов я реализовывал, а также при попытке запустить это вниз. За этой связь, я добавил новый статический класс BKLoader для загрузки QuantLibJNI, погрузил его с другими классами Java и попытался загрузки core.clj в РЕПЛ снова к звонким трубам:

UnsatisfiedLinkError no QuantLibJNI in java.library.path java.lang.Classloader.loadLibrary (ClassLoader.java:1758) 

В этот момент я вырву Класс Б. Николича из объявления ns в моем core.clj и взгляните на classlojure. Предложение

Per Apage43 в #clojure, в этот момент я бросаю следующее в моем core.clj:

(classlojure/with-classloader 
    (.getClassLoader Date) 
    (System/loadLibrary "QuantLibJNI")) 

Какие результаты в той же ошибки, как при вызове BKLoader класса.

Я ценю любую информацию, которую любой из вас может принести. Благодаря!

Решение

Решение добавить банку QuantLib к :java-source-paths в project.clj:

:java-source-paths ["src/main/java" "/usr/local/lib/QuantLib.jar"] 

ответ

0

Ошибка указывает на то, что виртуальная машина Java не может найти DLL он нуждается.

так, вероятно, длл он хочет загрузить не доступен в SRC/основной/Java из каталога, в котором вы запускаете файл, который вы указали его, чтобы найти его с помощью

:jvm-opts ["-Djava.library.path=src/main/java"] 

Иногда это длл, что там нет, но иногда dll также хочет загружать другие dll, поэтому в этом случае может быть хорошей идеей также установить переменную среды PATH, чтобы указать на каталоги, в которых могут быть загружены другие dll.

Существует инструмент от Microsoft, где вы можете отслеживать загрузку или необходимость dll, один из них - зависимыйWalker, а другой - processmonitor. Как бесплатно скачать где-нибудь в www.microsoft.com

+0

Он использует пиво, что означает, что он находится в Mac OS X, поэтому инструменты Microsoft вряд ли помогут. Но предложение правильное, он должен проверить, доступны ли общие библиотеки. Это будет означать libQuantLib.so и libQuantLibJNI.so. –

+0

Правильное решение (вероятно, прозрачное как грязь для любого, кто не работает с экосистемой Clojure) заключается в том, чтобы добавить банку QuantLib к «java-source-path» Leiningen'ам. Этот ответ заставил меня задуматься о скомпилированных файлах, и поэтому я считаю, что это хороший «правильный» ответ. – benkay

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