1

问题陈述:

我希望从 Clojure 命名空间调用 QuantLib Java 函数,如下所示:

(Date. 21 Month/September 2013)

到目前为止,我已经完成了以下工作:

$ brew install boost
$ brew install quantlib

下载生成的 SWIG 接口

创建了一个新的 Leiningen 项目。

将上述接口复制到 src/main/java/org/quantlib/

添加:

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

到我的project.clj.

我按照Bojan Nikolic 的说明解决了一个非常相似的类加载问题,添加了一个 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 有一个建议来处理这些类加载问题,我在尝试运行它时也实现了这些问题。根据该链接,我添加了一个新的静态类BKLoader来加载 QuantLibJNI,将其与其他 Java 类一起加载,并尝试core.clj再次加载到 REPL 中,以响亮的号角声:

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

此时,我从我的 ns 声明中删除了 B. Nikolic 的课程,core.clj并查看了classlojure

根据 Apage43 中的建议#clojure,此时我将以下内容放入我的core.clj

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

BKLoader这会导致与调用类时相同的错误。

我很感激你们中的任何人都可以带来的任何见解。谢谢!

解决方案

解决方案是将 QuantLib jar 添加到:java-source-pathsin project.clj

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

1 回答 1

0

该错误表明 java vm 找不到它需要的 DLL。

因此,它想要加载的 dll 可能在 src/main/java 中从您启动文件的目录中不可用,因为您指定它以通过以下方式找到它

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

有时是 dll 不在其中,但有时 dll 也想加载其他 dll,因此在这种情况下,将环境变量 PATH 设置为指向可以加载其他 dll 的目录可能是个好主意。

microsoft 提供了一个工具,您可以在其中跟踪正在加载或需要的 dll,一个是 dependencyWalker,另一个是 processmonitor。两者都可以从 www.microsoft.com 的某个地方免费下载

于 2013-09-16T07:55:37.963 回答