2015-09-16 60 views
1

JNA中有加載多個依賴庫的方法嗎?使用JNA加載多個依賴庫

我通常使用Native.loadLibrary(...)加載一個DLL。但我猜它不是這樣工作的,因爲我將這個函數調用分配給實例成員。

+1

多機庫或多個JNA庫映射來自同一本地庫? – technomage

+1

多個本地庫。它們完全不同。其中一個DLL依賴於另一個(我從Dependency Walker得到了這個) – wurmi

+1

只要確保先通過JNA或System.loadLibrary()加載其中一個_without_依賴關係。 – technomage

回答

3

比方說,我有庫foo和庫barbarfoo有依賴性;它也有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/LD_LIBRARY_PATH,窗戶上的/ 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"); 
} 
+0

非常感謝!它比我想象的要容易。 – wurmi

+0

所以這個假設Bar依賴於Foo?如果它們都相互依賴,是否有加載它們的方法? – Chris

+0

找出如何首先使用系統調用來完成它,然後在JNA中執行這些調用。 – technomage