将本机JNI共享库与Clojure库捆绑在一起 [英] Bundle native JNI shared libraries with Clojure libraries

查看:160
本文介绍了将本机JNI共享库与Clojure库捆绑在一起的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在编写一个涉及本地代码的clojure库。



进一步的信息:

$ b如果我将Clojure库部署到公共存储库(如clojars)
$ b

我的项目结构大致如下:

  src / 
native / - C代码,C对象文件和编译的共享库
java / - Java东西
clojure / - Clojure stuff


b $ b

我目前使用leineingen。我已经尝试:

 :jvm-opts [〜(str-Djava.library.path = src / native /: 
(System / getenv$ LD_LIBRARY_PATH))]

在项目中。但是,如果我将此项目包含为依赖项,我会收到 UnsatisfiedLink 错误。

解决方案

答案取决于您的确切用例。在最简单的情况下,您需要:




  • 在库jar中捆绑本机lib,例如通过包含 project.clj 中的:resource-paths 中的

  • 当你使用你的库时,你可以指定一个:native-prefix 选项,提取。例如,如果您的库在根文件夹中包含资源mylib.so,您可以这样指定: [com.foo/bar1.0.1:native-prefix] c:

  • 您还应该使用:native-path 选项指定提取的lib应该放在哪里:native-path
  • 最后, c>您已指定 java.library.path ,使用:jvm-opts >


这些选项记录在 sample leiningen project.clj



现在我说的原因取决于你的用例,想创建一个包含本地lib的uberjar,事情开始变得更杂乱。主要原因是你不能直接链接到一个在你的jar里面压缩的lib。如果您幸运,您可以使用 loadLibraryFromJar 方法blob / master / NativeUtils.javarel =nofollow> NativeUtils 类。但是,我记得有 ClassLoader 相关的问题,阻止我使用系统/加载。相反,我不得不确保该库存在于JVM查找的路径之一,因此 System / loadLibrary 找到它正确。这是我最后做的:



查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆