日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jna enum 对应 java_JNA简单使用

發布時間:2025/3/12 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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简单使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。