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

欢迎!请参阅 关于 页面以了解更多有关如何使用此功能的信息。

0
Clojure

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

在尝试创建一种简单的方法来加载嵌入在 uberjar 中的共享对象(使用 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 指向的路径中。例如,如果您在 LD_LIBRARY_PATH 上有 liba.so 文件,则 (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
回答 Jun 26, 2019 by
参考资料: https://clojure.atlassian.net/browse/CLJ-2243(由 alex+import 报告)
...