ByReference类有很多子类,这些类都非常有用。

ByteByReferenceDoubleByReferenceFloatByReferenceIntByReferenceLongByReferenceNativeLongByReferencePointerByReferenceShortByReferenceW32API.HANDLEByReferenceX11.AtomByReferenceX11.WindowByReference

ByteByReference等类故名思议,就是指向原生代码中的字节数据的指针。

PointerByReference类表示指向指针的指针。

在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++接口

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

Java JNA (四)—— void**、void*、char**、char*、int*等类型映射关系及简单示例的更多相关文章

  1. Mysql,Oracle与Java字段类型映射关系

    Mysql,Oracle与Java字段类型映射关系 参考相关博文 MySQL/Oracle字段类型 Java字段类型 最大长度 BIT java.lang.Boolean 1 BLOB java.la ...

  2. Java swing(awt):事件监听机制的实现原理+简单示例

    (1)实现原理 事件监听机制的实现: 参考图:事件模型_ActionEvent 为了节省资源,系统无法对某个事件进行实时的监听.故实现的机制是当发生某个事件后,处理代码将被自动运行,类似钩子一般.(回 ...

  3. Java 调用 C/C++ 之 JNA 系列实战篇 —— 输出char * (六)

    一. 工作环境 1. windows (64位), JDK (64位),dll文件 (64位) 2. Linux (64位),      JDK (64位),so文件 (64位) 3. JNA的官方资 ...

  4. java.lang基础数据类型boolean、char、byte、short、int、long、float、double (JDK1.8)

    java.lang.Boolean public static int hashCode(boolean value) { return value ? 1231 : 1237; } JDK 1.8新 ...

  5. java学习日志--char和int的相互转换

    package shugen; /*ASCLL码表 * 48 数字0 * 49 1 * 50 2 * 51 3 * 52 4 * 53 5 * 54 6 * 55 7 * 56 8 * 57 9 */ ...

  6. 一段代码了解Java中char和int的转换

    题目要求: 将输入的大写字母转成对应小写的后5个,如A转换后为f:如果转换后大于z则从a重新计,即多出1就转成a,多出2就转成b以此类推. Java代码: ```java private static ...

  7. Java中基本数据类型byte,short,char,int,long,float,double 取值范围

    部分内容转自:java 彻底理解 byte char short int float long double 首先说byte: 这段是摘自jdk中 Byte.java中的源代码: /** * A co ...

  8. void die(const char *msg)

    void die(const char *msg) { perror(msg); exit(errno); }

  9. [转] java中int,char,string三种类型的相互转换

    原文地址:http://blog.csdn.net/lisa0220/article/details/6649707 如何将字串 String 转换成整数 int? int i = Integer.v ...

随机推荐

  1. 超大文件上传方案(ASP.NET)

    ASP.NET上传文件用FileUpLoad就可以,但是对文件夹的操作却不能用FileUpLoad来实现. 下面这个示例便是使用ASP.NET来实现上传文件夹并对文件夹进行压缩以及解压. ASP.NE ...

  2. 特征提取算法(4)——LoG特征提取算法

    目录 1.介绍 2.LoG原理 3.数学原理 4.模板性质 1.介绍 LoG(DoG是一阶边缘提取)是二阶拉普拉斯-高斯边缘提取算法,先高斯滤波然后拉普拉斯边缘提取. Laplace算子对通过图像进行 ...

  3. windows及linux下 golang开发环境配置

    windows环境: 1.系统以及软件包版本: OS: windows 8.1  64位  x64处理器 GO:安装包:go1.7.3.windows-amd64.mis IDE:压缩包:liteid ...

  4. [BZOJ3262]:陌上花开(CDQ分治)

    题目传送门 题目描述 有$n$朵花,每朵花有三个属性:花形$(s)$.颜色$(c)$.气味$(m)$,用三个整数表示.现在要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花$A$比 ...

  5. 自定义类实现原生SQL的GROUP_CONCAT的功能

    大家都知道,原生的SQL为我们提供了分组之后查找组内数据的办法:GROUP_CONCAT方法:但是对于用Django开发的程序员来说-Django自带的ORM并没有内置这样功能的方法,而每一次遇到这样 ...

  6. CSS - 层叠上下文(The stacking context)

    对 MDN 的上的例子的拓展 Root - DIV #1(z-index: 5) - DIV #2(z-index: 2) - DIV #3(z-index: 4) - DIV #4(z-index: ...

  7. EDM设计案例分享:6款引人入胜的夏日邮件营销模板分享

    夏日酷暑,清凉如风.在这个假期,旅游行业.酒店.服饰等都推出不少的假期活动,吸引游者的到来.假日期间,让我们看看一些旅游业.品牌服装店和酒店是怎么做好电子邮件广告的.在此,Focussend精心为大家 ...

  8. pycharm中git配置(coding.net为例)

    1.在coding.net注册一个账号 2.登陆coding.net 3.新建项目->输入项目名称.项目描述->初始化仓库选择readme.md并且添加一个appachev2的开源许可证- ...

  9. vCenter 部件关系简介 & 网络原理

    目录 目录 主机和集群 vCenter Datacenter Cluster Host Virtual Machine Folder Resource Pool Template 数据存储 Datas ...

  10. django框架ORM数据库

    字段类型 选项 null是数据库范畴的概念,blank是表单验证范畴的 外键 在设置外键时,需要通过on_delete选项指明主表删除数据时,对于外键引用表数据如何处理,在django.db.mode ...