2024 Clojure状态调查!中分享您的想法。

欢迎!请查看关于页面以获取更多关于如何使用本站的信息。

0
Clojure

类似于CLJ-843,由于成功加载so文件至错误的类加载器(感谢SUN!),无法调用(System/load "/tmp/a.so")

在尝试将uberjars中嵌入的共享对象以简单方式加载(使用https://github.com/adamheinrich/native-utils/blob/master/src/main/java/cz/adamh/utils/NativeUtils.java)时,我发现由于类加载器问题,无法完成。

有什么想法吗?

3 个答案

0

评论者:alexmiller

那个链接的jira包含了一个补丁并已被提交,所以它似乎已经以(clojure.lang.RT/loadLibrary "/tmp/a.so")的形式存在了?

0

评论者:shlomi

亚历克斯,
抱歉我没有表述得足够清楚

(clojure.lang.RT/loadLibrary "/tmp/a.so") - 不起作用,loadLibrary期望库文件存在于由LD_LIBRARY_PATH或java.library.path指向的路径下。例如,如果你有一个名为liba.so文件存在于LD_LIBRARY_PATH的某个地方,那么(clojure.lang.RT/loadLibrary "a")将会工作。

对于不需要依赖环境设置或预存在.so文件的用例,您可以使用System/load来代替System/loadLibrary。例如,如果您想在正在运行的clojure程序中从某个平台下载适当的.so文件,或者将.so文件放在jar文件内部。在这些情况下,您可能需要分别从jar文件中解压缩或下载它们,将它们放在某个临时文件夹中(不在LD_LIBRARY_PATH中)并使用它们的完整路径来加载,以便在正在运行的程序中使用(即无需特殊的脚本或准备任务)。

如果您要为src/jvm/clojure/lang/RT.java编写补丁,它的内容将是:

// 在System ClassLoader中加载库,而不是clojure自身的库,从任何地方
public static void loadObject(String libFullPath){

System.load(libFullPath);

}

0
by
参考: https://clojure.atlassian.net/browse/CLJ-2243(由alex+import报告)
...