3

我用 C 语言创建了一个库,并使用 JNI 从 Java 调用它,所以我有我的包和一个带有 libMYLIB.so 文件的 lib 文件夹。我从 Java 写作中回忆起它:

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

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

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

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

是否可以告诉 Java 从 jar 文件中加载它?如何?

4

1 回答 1

3

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

    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();

但这掩盖了 JavaCPP 在Loader类中涵盖的许多极端情况和可移植性问题。

于 2014-11-07T13:09:00.767 回答