ByReference類有不少子類,這些類都很是有用。javascript
ByteByReference
、DoubleByReference
、FloatByReference
、IntByReference
、LongByReference
、NativeLongByReference
、PointerByReference
、ShortByReference
、W32API.HANDLEByReference
、X11.AtomByReference
、X11.WindowByReference
java
ByteByReference
等類故名思議,就是指向原生代碼中的字節數據的指針。網絡
PointerByReference
類表示指向指針的指針。socket
在JNA中模擬指針,最經常使用到的就是Pointer類和PointerByReference類。Pointer類表明指向任何東西的指針,PointerByReference類表示指向指針的指針。Pointer類更加通用,事實上PointerByReference類內部也持有Pointer類的實例。編碼
Native Type | Java Type |
---|---|
void ** | PointerByReference |
void* | Pointer |
char** | PointerByReference |
char& | PointerByReference |
char* | Pointer |
int& | IntByReference |
int* | IntByReference |
C++接口spa
////////////////////////////////////////////////////////////////////////// //TCP參數初始化 //功能:經過參數傳入,初始化TCP,爲打開鏈接作準備 //參數: // pHandle 爲保存打開的端口句柄 // pHostName 本機的IP地址,僅在網絡通信模式下有效 // nsocketPort 網絡SOCKET端口 //返回值: true爲操做成功, false爲操做失敗 ////////////////////////////////////////////////////////////////////////// bool RFID_API STDCALL SAAT_TCPInit(void** pHandle,char *pHostName,int nsocketPort); ////////////////////////////////////////////////////////////////////////// //打開讀寫器 //功能: 建立網絡鏈接 //參數: // pHandle 爲保存打開的端口句柄 //返回值: true爲操做成功, false爲操做失敗 ////////////////////////////////////////////////////////////////////////// bool RFID_API STDCALL SAAT_Open(void* pHandle); ////////////////////////////////////////////////////////////////////////// //系統信息查詢 //功能:查詢讀寫器參數 //參數: // pHandle: 打開的端口句柄 // nType : 要查詢的參數類型 // nType 定義 長度 // 0x00 讀寫器名稱 8字節 // 0x01 讀寫器產品型號 5字節 // 0x02 讀寫器出廠產品序列號 8字節 // 0x03 讀寫器處理器軟件版本號 4字節 // 0x04 讀寫器解碼單元軟件版本號 4字節 // 0x05 基帶電路硬件版本號 4字節 // 0x06 射頻電路硬件版本號 4字節 // pPara: 指向接收讀寫器參數數據內存的指針 // pLen: pLen指向的內存長度 //返回值: true爲操做成功, false爲操做失敗 bool RFID_API STDCALL SAAT_SysInfQuery (void* pHandle ,unsigned char nType, unsigned char *pPara, unsigned char *pLen); ////////////////////////////////////////////////////////////////////////// //有源-發送標籤主動上傳命令 //功能: 有源-發送標籤主動上傳命令 //參數: // pHandle 爲已經初始化的端口句柄 // nOpType: 爲操做模式, // 操做模式: // 00:對同一個標籤的ID碼讀寫器只向上位機返回一次, // 並要求上位機接收後給予讀寫器"返回數據確認", // 01":讀寫器將讀取到的全部的標籤ID碼所有上傳到上位機並不要求上位機接收後給予 // 讀寫器"返回數據確認",直到上位機下發"關功放"命令後才中止讀標籤ID碼。 // nIDType 要接收的ID編碼 //返回值: true爲操做成功, false爲操做失敗 ////////////////////////////////////////////////////////////////////////// bool RFID_API STDCALL SAAT_YMakeTagUpLoadIDCode ( void *pHandle, unsigned char nOpType, unsigned char nIDType); ////////////////////////////////////////////////////////////////////////// //接收有源ID碼命令 //功能:用於接收ID碼, ID碼爲十進制 //參數: // pHandle 爲已經初始化的端口句柄 // nTagType 爲標籤標記,0x00表示普通標籤;0x01表示溫度標籤;0x02表示激勵標籤 // pId 爲十進制int型ID, // nBit 爲標籤標記 // 域 保留 標籤ID類型 省電標記 傳感標記 按鍵標記 報警標記 低壓標記 // 位 2 1 1 1 1 1 1 // nParam1 溫度標籤整數 or 激勵地址 // nParam2 溫度標籤小數 or 場強強度 //返回值: 1爲操做成功, 0爲操做失敗 ////////////////////////////////////////////////////////////////////////// int RFID_API STDCALL SAAT_YRevIDMsgDecExpand(void *pHandle,unsigned char* nTagType,unsigned int* pId,unsigned char* pBit, int* nParam1, int* nParam2);
java對應接口與實現指針
package com.other; import com.sun.jna.Memory; import com.sun.jna.Native; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; import com.sun.jna.ptr.PointerByReference; import com.sun.jna.win32.StdCallLibrary; public class HTRFID { public interface JnaCallBackDll extends StdCallLibrary { public static JnaCallBackDll instance = (JnaCallBackDll) Native.loadLibrary("src/main/resources/RFIDAPI.dll", JnaCallBackDll.class); boolean SAAT_TCPInit(PointerByReference pointer, String pHostName, int nsocketPort); boolean SAAT_Open(Pointer pointer); boolean SAAT_YMakeTagUpLoadIDCode(Pointer pointer, byte nOpType, byte nIDType); int SAAT_YRevIDMsgDecExpand(Pointer pointer, Pointer nTagType, IntByReference pId, Pointer pBit, IntByReference nParam1, IntByReference nParam2); boolean SAAT_SysInfQuery(Pointer pointer, byte nType, Pointer pPara, Pointer pLen); } public static void main(String[] args) throws Exception { PointerByReference pointer = new PointerByReference(Pointer.NULL); boolean t = JnaCallBackDll.instance.SAAT_TCPInit(pointer, "192.168.3.219", 7086); System.out.println("初始化:" + t); t = JnaCallBackDll.instance.SAAT_Open(pointer.getValue()); System.out.println("打開鏈接:" + t); Thread.sleep(2000); Pointer pPara = new Memory(1024); Pointer pLen = new Memory(1024); t = JnaCallBackDll.instance.SAAT_SysInfQuery(pointer.getValue(), new Byte("00"), pPara, pLen); byte[] bytes = pPara.getByteArray(0, 8); String sysinfo = new String(bytes); System.out.println("讀寫器名稱:" + sysinfo.substring(0,5)); t = JnaCallBackDll.instance.SAAT_YMakeTagUpLoadIDCode(pointer.getValue(), new Byte("01"), new Byte("01")); System.out.println("主動查詢:" + t); while (true) { Pointer nTagType = new Memory(1024); IntByReference pId = new IntByReference(); pId.setValue(0); Pointer pBit = new Memory(1024); IntByReference nParam1 = new IntByReference(); nParam1.setValue(0); IntByReference nParam2 = new IntByReference(); nParam2.setValue(0); int result = JnaCallBackDll.instance.SAAT_YRevIDMsgDecExpand(pointer.getValue(), nTagType, pId, pBit, nParam1, nParam2); if (result == 1) { System.out.println("標籤編號" + pId.getValue()); System.out.println("激勵地址" + nParam1.getValue()); System.out.println("場強強度" + nParam2.getValue()); } } } }