近期使用Java開發有關於攝像機接收到數據的上傳,由於攝像機處理圖像是用C語言實現的,因此開發須要用到JNA,實現JAVA對C語言的回調,由於具體的開發方式官方文檔裏面有示例,因此本文只是簡單的把須要注意的點羅列出來。java
1、 定義數組
JNA提供一些JAVA工具類,在運行期間訪問本地庫,如dll/so。app
2、 數據類型對照表函數
官方提供的數據參考表徹底夠用,當使用數據參考時候,注意參考頭文件宏定義。工具
一、常見數據類型對照spa
Java 類型 | C 類型 | 原生表現 |
---|---|---|
boolean | int | 32位整數 (可定製) |
byte | char | 8位整數 |
char | wchar_t | 平臺依賴 |
short | short | 16位整數 |
int | int | 32位整數 |
long | long long, __int64 | 64位整數 |
float | float | 32位浮點數 |
double | double | 64位浮點數 |
Buffer/ [Pointer] | pointer | 平臺依賴(32或 64位指針) |
Pointer/array | 32或 64位指針(參數/返回值) |
其餘經常使用:3d
Java 類型 | C 類型 | 原生表現 |
---|---|---|
String | char* | /0結束的數組 (native encoding or jna.encoding) |
WString | wchar_t* | /0結束的數組(unicode) |
String[] | char** | /0結束的數組的數組 |
WString[] | wchar_t** | /0結束的寬字符數組的數組 |
Structure[] | struct[] | 結構體的數組,鄰接內存 |
Callback | Java函數指針或原生函數指針 | |
NativeMapped | varies | 依賴於定義 |
NativeLong | long | 平臺依賴(32或64位整數) |
PointerType | pointer | 和 Pointer相同 |
Structure | struct* struct | 指向結構體的指針或結構體,都明確指出,後面詳細討論 |
二、C語言部分經常使用定義,注意dll內的定義。指針
#define WORD unsigned short
#define DWORD unsigned int
#define LONG int
#define LLONG long
#define INT64 long long
#define LDWORD long
#define BOOL intcode
3、調用方法blog
一、簡單函數調用
這裏使用deSDK.dll,放到工程目錄之下。
dll提供接口函數:
BOOL C_Init(LDWORD dwUser);
Java代碼聲明:
public class getdeSDK{
public interface Function extends Library {
Function Jinit = (Function)Native.loadLibrary("getdeSDK.dll",Function.class);
public boolean C_Init(Nativelong dwUser);
}
}
二、回調函數調用
在dll中定義回調函數,使用時候直接繼承(implements)java中聲明的接口。
Java代碼聲明:
public interface fDataCallBack extends StdCallCallback {
public int invoke(NativeLong dwUser);
}
三、模擬結構體
回調函數參數會出現結構體或者以結構體自己做爲其餘的結構體的元素存在,判斷結構體是以自己傳遞仍是所爲指針存在,詳細使用看官方文檔。
java聲明:
public static class MYCLASS extends Structure{
//這裏寫與dll中相對應的變量與常量。
public Nativelong dwUser;
public byte[] dwName;//char數組
}
四、注意事項
枚舉(enum)
在dll中使用enum,在java聲明中一樣使用enum,但要注意的是,在C中直接使用枚舉成員能夠做爲序號來用,而java須要在枚舉成員後加ordinal()方法。
ByReference與ByValue:
public static class ByValue extends MYCLASS implements Structure.ByValue {}
public static class ByReference extends MYCLASS implements Structure.ByReference {}
若是你的Struct實現Structure.ByReference接口,那麼JNA認爲你的Struct是一個指針。指向C語言的結構體。 若是你的Struct實現Structure.ByValue接口,那麼JNA認爲你的Struct是值類型,就是C語言的結構體