Clojure / QuantLib互操作:类加载困境

时间:2013-09-16 07:35:11

标签: java clojure swig quantlib clojure-java-interop

问题陈述:

我希望从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"]

1 个答案:

答案 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的某个地方免费下载