使用JNA加载多个依赖库

时间:2015-09-16 13:20:56

标签: java dll jna

JNA中有没有办法用Java加载多个依赖库?

我通常使用Native.loadLibrary(...)加载一个DLL。但我想这不会这样,因为我将此函数调用分配给实例成员。

2 个答案:

答案 0 :(得分:4)

假设我有图书馆foo和图书馆barbar依赖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或未设置时)。

Javadoc

RTFM和快乐的编码。 JNA v.4.1.0