有问题的库是Tokyo Cabinet。
我想要在一个JAR文件中具有本机库,JNI库和所有Java API类,以避免重新分配的麻烦。
似乎有an attempt at this at GitHub,但是
它不包括实际的本机库,仅包括JNI库。
它似乎特定于Leiningen的本机依赖性插件(它不能作为可再发行组件使用)。
问题是,我可以将所有内容捆绑在一个JAR中并重新分发吗?如果是,怎么办?
附注:是的,我意识到这可能会带来可移植性。
最佳答案
可以创建具有所有依赖性的单个JAR文件,包括一个或多个平台的本机JNI库。基本机制是使用System.load(File)加载库,而不是使用典型的System.loadLibrary(String)来搜索java.library.path系统属性。由于用户不必在系统上安装JNI库,因此此方法使安装更加简单,但是这样做可能会不支持所有平台,因为平台的特定库可能未包含在单个JAR文件中。
流程如下:
在平台特定位置的JAR文件中包含本地JNI库,例如,在NATIVE / $ {os.arch} / $ {os.name} /libname.lib
在主类的静态初始化中创建代码以
计算当前的os.arch和os.name
使用Class.getResource(String)在预定义位置的JAR文件中查找库
如果存在,请将其提取到临时文件中,并使用System.load(File)加载。
我添加了为jzmq(ZeroMQ(无耻插件)的Java绑定)执行此操作的功能。可以在here中找到该代码。 jzmq代码使用混合解决方案,因此,如果无法加载嵌入式库,则该代码将恢复为沿java.library.path搜索JNI库。