我用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.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所涵盖的许多角落情况和可移植性问题。