Java中JNA調用教程

       近期使用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語言的結構體

相關文章
相關標籤/搜索