Java Clojure/QuantLib互操作:类加载难题 问题陈述:

Java Clojure/QuantLib互操作:类加载难题 问题陈述:,java,clojure,swig,quantlib,clojure-java-interop,Java,Clojure,Swig,Quantlib,Clojure Java Interop,我希望从Clojure命名空间调用QuantLib Java函数,如下所示: (Date. 21 Month/September 2013) 到目前为止,我已经做了以下工作: 下载 创建了一个新的Leiningen项目 将所述接口复制到 src/main/java/org/quantlib/ 增加: :jvm-opts ["-Djava.library.path=src/main/java"] :java-source-paths ["src/main/java/"] 到我的项目.clj 我

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

(Date. 21 Month/September 2013)
到目前为止,我已经做了以下工作: 下载

创建了一个新的Leiningen项目

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

增加:

:jvm-opts ["-Djava.library.path=src/main/java"]
:java-source-paths ["src/main/java/"]
到我的
项目.clj

我随后添加了一个类装入器

当我将我的
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)
在这一点上,我从我的
core.clj
中的ns声明中删除了B.Nikolic的类,并查看

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

(classlojure/with-classloader
  (.getClassLoader Date) 
  (System/loadLibrary "QuantLibJNI"))
:java-source-paths ["src/main/java" "/usr/local/lib/QuantLib.jar"]
这将导致与调用
BKLoader
类时相同的错误

我很感激你们能带来的任何见解。谢谢

解决方案 解决方案是将QuantLib jar添加到
项目.clj
中的
:java源路径中:

(classlojure/with-classloader
  (.getClassLoader Date) 
  (System/loadLibrary "QuantLibJNI"))
:java-source-paths ["src/main/java" "/usr/local/lib/QuantLib.jar"]

该错误表示java vm找不到所需的DLL

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

:jvm-opts ["-Djava.library.path=src/main/java"]
有时是dll不在其中,但有时dll也要加载其他dll,因此在这种情况下,最好将环境变量路径设置为指向可以加载其他dll的目录


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

他使用的是brew,这意味着他使用的是Mac OS X,因此微软的工具不太可能有帮助。但是这个建议是正确的,他应该检查共享库是否可用。这意味着libQuantLib.so和libQuantLibJNI.so。正确的解决方案(对任何不使用Clojure生态系统的人来说可能都是透明的)是将QuantLib jar添加到Leiningen的
java源路径中。这个答案让我想到了编译文件,所以我认为这仍然是一个很好的“正确”答案。