使用 JNA 加载多个依赖库

wur*_*rmi 1 java dll jna

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

我通常Native.loadLibrary(...)用来加载一个 DLL。但我想它不会以这种方式工作,因为我将此函数调用分配给了实例成员。

tec*_*age 6

假设我有 libraryfoo和 library 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();
}
Run Code Online (Sandbox Code Playgroud)

System.load/loadLibrary仅当baz既不在您的库加载路径(PATH/ LD_LIBRARY_PATH,分别用于 windows/linux )也不在与bar(仅限 windows)相同的目录中时,才需要调用。

编辑

你也可以通过接口映射来做到这一点:

public interface Foo extends Library {
    Foo INSTANCE = (Foo)Native.loadLibrary("foo");
}
public interface Bar extends Library {
    // Reference Foo prior to instantiating Bar, just be sure
    // to reference the Foo class prior to creating the Bar instance
    Foo FOO = Foo.INSTANCE;
    Bar INSTANCE = (Bar)Native.loadLibrary("bar");
}
Run Code Online (Sandbox Code Playgroud)