JNA中有没有办法用Java加载多个依赖库?
我通常使用Native.loadLibrary(...)
加载一个DLL。但我想这不会这样,因为我将此函数调用分配给实例成员。
答案 0 :(得分:4)
假设我有图书馆foo
和图书馆bar
。 bar
依赖foo
;它还依赖于baz
,我们不映射到JNA:
public class Foo {
public static final boolean LOADED;
static {
Native.register("foo");
LOADED = true;
}
public static native void call_foo();
}
public class Bar {
static {
// Reference "Foo" so that it is loaded first
if (Foo.LOADED) {
System.loadLibrary("baz");
// Or System.load("/path/to/libbaz.so")
Native.register("bar");
}
}
public static native void call_bar();
}
只有在System.load/loadLibrary
既不在您的库加载路径(baz
/ PATH
上,对于Windows / linux,也不在与LD_LIBRARY_PATH
相同的目录(仅限Windows)。
修改强>
您也可以通过界面映射来执行此操作:
bar
答案 1 :(得分:0)
使用JAR资源的JNA加载lib临时依赖项。
我的资源文件夹资源:
res/
`-- linux-x86-64
|-- libapi.so
|-- libdependency.so
-
MyApiLibrary api = (MyApiLibrary) Native.loadLibrary("libapi.so", MyApiLibrary.class, options);
API爆炸: 原因:java.lang.UnsatisfiedLinkError:加载共享库libdependency时出错。so:没有此类文件或目录
可以通过手动加载依赖项来解决:
import com.sun.jna.Library;
Native.loadLibrary("libdependency.so", Library.class);
MyApiLibrary api = (MyApiLibrary) Native.loadLibrary("libapi.so", MyApiLibrary.class, options);
基本上,您必须自己手工反向构建依赖关系树。
我建议设置
java -Djna.debug_load=true -Djna.debug_load.jna=true
此外,将 jna.library.path 设置为Resource无效,因为JNA提取到文件系统,然后加载lib。文件系统上的库无法访问jar中的其他库。
上下文类加载器的类路径。部署的本机库可能是 安装在$ {os-prefix} / LIBRARY_FILENAME下的类路径中,其中 $ {os-prefix}是操作系统返回的Arch前缀 Platform.getNativeLibraryResourcePrefix()。如果捆绑在jar文件中, 资源将被提取到jna.tmpdir进行加载,并在以后 删除(但仅当jna.nounpack为false或未设置时)。
RTFM和快乐的编码。 JNA v.4.1.0