Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从jar加载.so文件_Java_C_Java Native Interface_Loadlibrary_Library Path - Fatal编程技术网

Java 从jar加载.so文件

Java 从jar加载.so文件,java,c,java-native-interface,loadlibrary,library-path,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 可以告诉

我用C编写了一个库,我用JNI从Java调用它,所以我有我的包和一个libMYLIB.so文件的lib文件夹。我从Java编写中回忆起:

static{
    System.loadLibrary("MYLIB");
}
如果我使用-Djava.library.path=../lib选项执行它,它会工作得很好

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

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


可以告诉Java从jar文件加载它吗?如何操作?

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

    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在类中涉及的许多角落情况和可移植性问题。

有四种加载库的方法:好的,但是如果我想将它包含在jar文件中,有没有一种方法可以通过编程方式将该路径添加到library.path?不是直接加载,我们需要提取库。顺便说一句,它的功能正好适合这种情况。如果你愿意的话,我可以详细解释一下。我非常感兴趣。。。如果可以:)对于硬盘来说压力很大,但这是将.so文件保存在jar中的唯一方法@DavideTheSgrash嗯,这确实是操作系统的问题:他们需要一个实际的库文件。不过大多数人都支持在RAM中挂载临时目录。我们有同样的要求,这种方法对我们不起作用。Linux操作系统和Java8。我们遗漏了什么吗?没有。没有。在我们的例子中,我们已经在jar中打包了.so文件。我们试图在jar中编写/添加一个类,以便在运行时加载so文件。我们使用上面的代码来实现这一点。结果是,lib被提取到temp目录,并执行
System.load()
,但当尝试访问lib时失败。我们遗漏了什么吗?谢谢,非常有用。我在过去两天里一直在处理这个问题,最终得到了解决方案。