java - 使用 JNA 加载多个依赖库

标签 java dll jna

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

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

最佳答案

假设我有库 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();
}

仅当 baz 不在您的库加载路径 (PATH/LD_LIBRARY_PATH,分别用于 windows/linux),也不在与 bar 相同的目录中(仅限 windows)。

编辑

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

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");
}

关于java - 使用 JNA 加载多个依赖库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32609829/

相关文章:

java - 有没有一种方法可以让一个具有泛型类型的接口(interface)扩展另一个具有 Java 中另一个泛型类型的接口(interface)?

java - 使用异常类对错误建模

java - JSF 和 Facelets 流程

c++ - 我如何获得代码::blocks to keep the libraries configured after code::blocks restarts?

c# - Tesseract 3.02 无法加载 DLL

python - 使用 ctypes 和 Python 将字符串传递给 Fortran DLL

java - 使用 JNA SetForeGroundWindow

java - 如何填充在android中单击按钮时动态生成的微调器

c# - Java 中的 Marshal.Copy

java - JNA java.lang.UnsatisfiedLinkError : Unable to load library './OUNPPM'