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

欢迎!请查阅 关于 页面以了解更多关于如何使用本站的信息。

0
Clojure

类似于 CLJ-843,由于 SUN!成功地将 so 文件加载到错误的类加载器中,无法调用 (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

Alex,
对不起,表达不够清晰。

(clojure.lang.RT/loadLibrary "/tmp/a.so") - 不工作,loadLibrary 预期存在 SD_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(由ale xa+import报告)
...