1. 程式人生 > >Java中JNA呼叫教程

Java中JNA呼叫教程

在這裡插入圖片描述

近期使用Java開發有關於攝像機接收到資料的上傳,因為攝像機處理影象是用C語言實現的,所以開發需要用到JNA,實現JAVA對C語言的回撥,因為具體的開發方式官方文件裡面有示例,所以本文只是簡單的把需要注意的點羅列出來。
在這裡插入圖片描述
一、 定義
JNA提供一些JAVA工具類,在執行期間訪問本地庫,如dll/so。
二、 資料型別對照表
官方提供的資料參考表完全夠用,當使用資料參考時候,注意參考標頭檔案巨集定義。
1、常見資料型別對照Java 型別C 型別原生表現booleanint32位整數 (可定製)bytechar8位整數charwchar_t平臺依賴shortshort16位整數intint32位整數longlong long, __int6464位整數floatfloat32位浮點數doubledouble64位浮點數Buffer/ [Pointer]pointer平臺依賴(32或 64位指標)
Pointer/array32或 64位指標(引數/返回值)
其他常用:
Java 型別C 型別原生表現Stringchar*/0結束的陣列 (native encoding or jna.encoding)WStringwchar_t*/0結束的陣列(unicode)String[]char**/0結束的陣列的陣列WString[]wchar_t**/0結束的寬字元陣列的陣列Structure[]struct[]結構體的陣列,鄰接記憶體Callback
Java函式指標或原生函式指標NativeMappedvaries依賴於定義NativeLonglong平臺依賴(32或64位整數)PointerTypepointer和 Pointer相同Structurestruct* 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);
}
}
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語言的結構體
文章來自:

https://www.itjmd.com/news/show-5337.html