2011-02-28 93 views
0

我正在構建一個J2EE項目,我想在其中使用一個僅在C中可用的API。 我正在考慮使用JNI來做到這一點,但在快速查看this tutorial後,它看起來我在爲了使用JNI,我需要有源代碼(.c文件)來編譯某種「JNI庫」。如何在Java中使用C API? JNI?

在我的情況下,API只適用於具有所有方法的簽名的.h以及已編譯的.dll(或.so)。

我該怎麼做?

謝謝!

+0

http://cnd.netbeans.org/docs/jni/nb6-linux/beginning-jni-linux.html – 2011-02-28 12:22:05

回答

4

JNA是一個基於JNI的庫,它允許調用普通的C函數,而不需要爲每個函數提供JNI特定的包裝。

+0

我在看JNA選項,但是我遇到的問題是大量使用的數據結構未知。我在api.h中關於它們的唯一信息是:「typedef struct my_data_structure my_data_structure; /// <我的數據對象上的句柄」。我還可以使用JNA嗎? – nbarraille 2011-02-28 14:28:26

+0

這取決於:如果你只傳遞指向這些類型的指針,你應該沒問題(並且簡單地像對待'void *'那樣對待它們)。你需要操縱它們,那麼無論你使用哪種語言/ API,你都會走運。 – 2011-02-28 14:31:16

+0

搬到[GitHub](https://github.com/java-native-access/jna) – AndyFaizan 2017-02-24 12:32:45

0

爲本地庫創建一個小C包裝,將其編譯爲.dll/.so。

對於現有C api中的每個需要的函數,創建一個簡單調用真實API的符合JNI的C函數。

+0

JNA應該取消這種包裝的需要。 – 2011-02-28 12:21:29

1

結賬JNA。它允許你直接使用.DLL。所有你需要做的就是用.DLL編寫一個你需要的相同函數的Java接口。

+0

我在看JNA選項,但是我遇到的問題是很多使用的數據結構不是衆所周知。我在api.h中關於它們的唯一信息是:「typedef struct my_data_structure my_data_structure; /// <我的數據對象上的句柄」。我還可以使用JNA嗎? – nbarraille 2011-02-28 14:30:04

0

JNI提供了一個相當低級別的API,用於將Java代碼與本機代碼進行接口連接。如果你沒有花錢,Jinvoke看起來是一個很好的選擇,它不需要你編寫任何C/C++代碼。這裏的優點是您可以獲得全額支持。如果你不需要它,你可以和JNA一起去。除了JNI IMO ...