2011-05-31 146 views
4

我們有一些我們需要連接的專有庫。這些庫是Windows DLL或Linux .so文件。我們得到了頭文件來定義接口。由於我從來沒有對本地庫進行過任何操作,因此我查看了JNAerator(http://code.google.com/p/jnaerator/)以及BridJ和JNA的內容。從C++頭文件生成Java接口

什麼是使用C++頭文件和編譯的lib生成接口的簡單方法?例如,通過採用JNA一般的東西,如:

SomeDLL lib = (SomeDLL) Native.loadLibrary("some_dll", SomeDLL.class); 

我必須保持DLL的地方:我怎麼用捆綁JAR中的DLL?我使用Maven構建Jar文件...但Native.loadLibrary接口不允許直接指定路徑。

+0

另請參閱http://stackoverflow.com/questions/3720563/access-c-shared-library-from-java-jni-jna-cni-or-swig – 2011-05-31 17:39:53

回答

2

JNI編碼通常是編寫C++代碼以創建本機粘貼方法的手動過程。有一本解釋它的書。

在某些情況下,http://jna.java.net/可以自動化或加速此過程,但不要指望它。

除非您沿着使用OSGi或類似Tanukisoft打包工具的路徑,否則不能'捆綁本地庫',因此在Java中沒有用於此目的的內置功能。

通過使用-Djava.library.path連接點來告訴java在哪裏可以找到本地庫,或者使用允許您指定完整路徑的System.loadLibrary的低級API。

如果您的本機庫依次具有依賴項,請注意與PATH和LD_LIBRARY_PATH的交互。

+0

很多人都指望JNA用於生產,現在有些人甚至指望BridJ。由於JNAerator的原因,它們都允許本機代碼捆綁和相對無縫的代碼生成,而且根本沒有本地粘合劑。 – zOlive 2011-09-23 12:01:27

0

使用BridJ,您可以將JAR中的DLL/.so/.dylib很好地捆綁在一起,但是您必須將它(或它們)放入JAR中的特定平臺相關路徑中,該路徑由「org/bridj/lib /「,並以平臺+體系結構標識符結束。

這裏的BridJ自己的源代碼樹,表現出這個本地綁定方案: org/bridj/lib resource directory

如果你堅持這個約定,你就不必做處理PATH,LD_LIBRARY_PATH或文件提取:BridJ.register()(叫上@Library -annotated類與本地方法)將爲你做這一切!