我希望从Clojure命名空间调用QuantLib Java函数,如下所示:
(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
文件加载到REPL中时,出现以下错误:
UnsatisfiedLinkError org.quantlib.QuantLibJNI.new_Date__SWIG_1(III)J org.quantlib.QuantLibJNI.new_Date__SWIG1 (QuantLibJNI.java:-2)
Bojan Nikolic有a recommendation来处理这些类加载问题,我在尝试运行它时也实现了这些问题。根据该链接,我添加了一个新的静态类BKLoader
来加载QuantLibJNI,将其与其他Java类一起加载并尝试再次将core.clj
加载到REPL中,以及响亮的小号:
UnsatisfiedLinkError no QuantLibJNI in java.library.path java.lang.Classloader.loadLibrary (ClassLoader.java:1758)
此时,我从core.clj
中的ns声明中删除了B. Nikolic的课程,并查看classlojure。
根据#clojure
中的每个Apage43的建议,此时我将以下内容放入core.clj
:
(classlojure/with-classloader
(.getClassLoader Date)
(System/loadLibrary "QuantLibJNI"))
导致与调用BKLoader
类时相同的错误。
我很欣赏你们所能提出的任何见解。谢谢!
解决方案是将QuantLib jar添加到:java-source-paths
中的project.clj
:
:java-source-paths ["src/main/java" "/usr/local/lib/QuantLib.jar"]
答案 0 :(得分:0)
错误表明java vm无法找到所需的DLL。
所以它可能加载的dll在你启动文件的目录中的src / main / java中不可用,因为你指定它来通过
找到它:jvm-opts ["-Djava.library.path=src/main/java"]
有时它是不在那里的dll,但有时dll也想加载其他dll,所以在这种情况下也可以设置你的环境变量PATH指向其他dll可以的目录加载。
微软有一个工具可以跟踪正在加载或需要的dll,一个是dependencyWalker,另一个是processmonitor。两者都可以从www.microsoft.com的某个地方免费下载