Java Clojure/QuantLib互操作:类加载难题 问题陈述:
我希望从Clojure命名空间调用QuantLib Java函数,如下所示: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 我
(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源路径中。这个答案让我想到了编译文件,所以我认为这仍然是一个很好的“正确”答案。