Reputation: 87
I made a library in C and I call it from Java with JNI so I have my package and a lib folder with the libMYLIB.so file. I recall it from Java writing:
static{
System.loadLibrary("MYLIB");
}
If I execute it with the option -Djava.library.path=../lib it works well.
But I need to create a jar file with my package and lib folder; so I made it and import in a more complex project.
In the big project the classes of my package are seen and used but at run-time Java fails to load MYLIB.
Is it possible to tell Java to load it from jar file? How?
Upvotes: 4
Views: 10688
Reputation: 4994
First, we need to make sure the JAR file is in the class path. Then, here is a simple way of loading the library, assuming it is found under /com/example/libMYLIB.so
in the JAR:
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();
But this glosses over a lot of corner cases and portability issues that are covered by JavaCPP inside the Loader class.
Upvotes: 4