jna enum 对应 java_JNA简单使用
近期使用Java開發有關于攝像機接收到數據的上傳,因為攝像機處理圖像是用C語言實現的,所以開發需要用到JNA,實現JAVA對C語言的回調,因為具體的開發方式官方文檔里面有示例,所以本文只是簡單的把需要注意的點羅列出來。
一、 定義
JNA提供一些JAVA工具類,在運行期間訪問本地庫,如dll/so。
二、 數據類型對照表
官方提供的數據參考表完全夠用,當使用數據參考時候,注意參考頭文件宏定義。
1、常見數據類型對照
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位指針(參數/返回值)
其他常用:
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
(*fp)()
Java函數指針或原生函數指針
NativeMapped
varies
依賴于定義
NativeLong
long
平臺依賴(32或64位整數)
PointerType
pointer
和 Pointer相同
Structure
struct*\ struct
指向結構體的指針或結構體,都明確指出,后面詳細討論
2、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 int
三、調用方法
1、簡單函數調用
這里使用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);
}
}
Java代碼調用:
boolean flag = getSDK.Function.Jinit.C_Init(1);
2、回調函數調用
在dll中定義回調函數,使用時候直接繼承(implements)java中聲明的接口。
Java代碼聲明
public interface fDataCallBack extends StdCallCallback {
public int invoke(NativeLong dwUser);
}
3、模擬結構體
回調函數參數會出現結構體或者以結構體本身作為其他的結構體的元素存在,判斷結構體是以本身傳遞還是所為指針存在,詳細使用看官方文檔。
java聲明
public static class MYCLASS extends Structure{
//這里寫與dll中相對應的變量與常量。
public Nativelong dwUser;
public byte[] dwName;//char數組
}
4、注意事項
枚舉(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語言的結構體
四、參考資料
1、官方文檔:
2、部分博客:
總結
以上是生活随笔為你收集整理的jna enum 对应 java_JNA简单使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php嗅探木马,PHP安全-密码嗅探
- 下一篇: sql group by having用