Java JNA (四)—— void**、void*、char**、char*、int*等類型映射關係及簡單示例

ByReference類有不少子類,這些類都很是有用。javascript

ByteByReferenceDoubleByReferenceFloatByReferenceIntByReferenceLongByReferenceNativeLongByReferencePointerByReferenceShortByReferenceW32API.HANDLEByReferenceX11.AtomByReferenceX11.WindowByReferencejava

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());
			}
		}
	}

}
相關文章
相關標籤/搜索