从jar中加载.so文件

时间:2014-10-30 11:40:19

标签: java c java-native-interface loadlibrary library-path

我在C中创建了一个库,我用JNI从Java调用它,所以我有我的包和一个包含libMYLIB.so文件的lib文件夹。我记得它来自Java写作:

static{
    System.loadLibrary("MYLIB");
}

如果我使用-Djava.library.path = .. / lib选项执行它,它运行良好。

但我需要用我的包和lib文件夹创建一个jar文件;所以我做了它并导入了一个更复杂的项目。

在大项目中,我看到并使用了我的包的类,但在运行时Java无法加载MYLIB。

是否有可能告诉Java从jar文件加载它?怎么样?

1 个答案:

答案 0 :(得分:1)

首先,我们需要确保JAR文件位于类路径中。然后,这是一个加载库的简单方法,假设它在JAR中的/com/example/libMYLIB.so下找到:

    InputStream is = ClassLoader.class.getResourceAsStream("/com/example/libMYLIB.so");
    File file = File.createTempFile("lib", ".so");
    OutputStream os = new FileOutputStream(file);
    byte[] buffer = new byte[1024];
    int length;
    while ((length = is.read(buffer)) != -1) {
        os.write(buffer, 0, length);
    }
    is.close();
    os.close();

    System.load(file.getAbsolutePath());
    file.deleteOnExit();

但这掩盖了Loader类中JavaCPP所涵盖的许多极端案例和可移植性问题。