http://blog.csdn.net/zhuzhichao0201/article/details/5817819

不是很明白,先记在这里

————————————————————————————————————————————————————————————

dll里面给的函数如下:
ReadWordBlock(HANDLE hScanner, 
BYTE EPC_WORD, 
BYTE *IDBuffer, 
BYTE mem, 
BYTE ptr, 
BYTE len, 
BYTE *Data, 
BYTE *AccessPassword);
函数调用的时候BYTE *Data为输出参数,其他为输入参数。
C里面调用赋值为:
ReadWordBlock(m_hScanner,EPC_Word,IDTemp,mem,ptr,len,&DB[0],AccessPassword);
其中&DB[0]为输出。
怎样在java里面实现呢?

在java模拟写入:

ReadWordBlock(Pointer hScanner, 
BYTE EPC_WORD, 
BYTE[] IDBuffer, 
BYTE mem, 
BYTE ptr, 
BYTE len, 
ByteByReference Data, 
BYTE[] AccessPassword);

调用的时候:

ByteByReference p_Data;

Memory mymem = new Memory(100);

p_Data.setPointer(mymem);

ReadWordBlock(m_hScanner,EPC_Word,IDTemp,mem,ptr,len,p_DB,AccessPassword);
byte[] DB = new byte[100];

mymem.read(0, DB, 0, 100);

关于jna模拟指针的问题归纳:

byte* 可以模拟为ByteByReference, byte[],int[]等等,视应用时的类型而定。

如果使用int[]很有可能造成数据出错,因为int的数据长度与byte不一样。

而如果使用byte[]要考虑到数据超过127的时候会变为负数。

解决办法为先定义一个int型数组获取到值以后,再用byte[]型数组获取:

int[] IDTemp[] = new int[12];

for (i = 0; i < 12; i++) {
      IDTemp[i] = IDBuffer[CurSel][i + 1];//将获取的值放在IDTemp中
     }

byte[] tempIDTemp = new byte[12];
for (int m = 0; m < 12; m++) {             //将int型的值变为byte型的送进dll对应的byte型参数
      if (IDTemp[m] > 127) {
       tempIDTemp[m] = (byte) (IDTemp[m] - 256);
      } else {
       tempIDTemp[m] = (byte) IDTemp[m];
      }

}

[转]jna模拟指针开辟空间,数组首地址获取值的更多相关文章

  1. c++ 二维数组定义 二维数组首地址查询

    #include <iostream> using namespace std; int main() { ][] = { {,,}, {,,} }; cout << &quo ...

  2. C语言——数组名、取数组首地址的区别(一)

    目录: 1. 开篇 2. 论数组名array.&array的区别 3. array.&array的区别表现在什么地方 4. 讨论 5. 参考 1.开篇 很多博客和贴吧都有讨论这个话题, ...

  3. C语言学习笔记 (004) - 数组名和数组首地址(转)

    一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址.指针变量既然可以指向变量,当然也可以指向数组和数组元素(把数据起始地址或某一元素的地址放到一个指针变量中) ...

  4. 对数组名取地址&a和 数组首地址a

    #include <iostream> using namespace std; ] = {,,,,}; int main() { cout<<a<<" ...

  5. C语言 指针基础篇 数组,函数与指针的运用 2 14

    下面看看如何在函数中运用指针吧 下面是往函数传入指针的简单操作,不是传入数组的.判断一个a是否大于b是的话给,是的话对其进行操作,不是的话就直接返回. #include <stdio.h> ...

  6. C语言指针系列 - 一级指针.一维数组,二级指针,二维数组,指针数组,数组指针,函数指针,指针函数

    1. 数组名 C语言中的数组名是一个特殊的存在, 从本质上来讲, 数组名是一个地址, 我们可以打印一个指针的值,和打印一个数组的值来观察出这个本质: int nArray[10] ={ 0 }; in ...

  7. C++——指针2-指向数组的指针和指针数组

    7.4 指向数组元素的指针 声明与赋值 例:int a[10], *pa; pa=&a[0]; 或 pa=a[p1] ; 通过指针引用数组元素,经过上述声明及赋值后: *pa就是a[0],*( ...

  8. C语言多维数组的地址

    设有整型二维数组a[3][4]如下: 0   1   2   3 4   5   6   7 8   9  10  11  它的定义为:     int a[3][4]={{0,1,2,3},{4,5 ...

  9. C语言提高 (3) 第三天 二级指针的三种模型 栈上指针数组、栈上二维数组、堆上开辟空间

    1 作业讲解 指针间接操作的三个必要条件 两个变量 其中一个是指针 建立关联:用一个指针指向另一个地址 * 简述sizeof和strlen的区别 strlen求字符串长度,字符数组到’\0’就结束 s ...

随机推荐

  1. tomcat通过虚拟路径访问外部静态资源

    转载:http://blog.csdn.net/yuancenyi/article/details/53414397 在项目开发中,单个工程中,为了以后软件版本升级的方便,经常将网站运行中某些上传的静 ...

  2. string 与BigDecimal互转

    小编知道在java中数据类型非常 的严格了,我们如果一个地方不小心就会导致应用出问题了,今天 小编就在string 转BigDecimal上碰到了一些问题,下面整理了几个例子大家一起来看看.   例子 ...

  3. Lucene Spatial构建地理空间索引

    一.Maven依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...

  4. MySql sqlstate代码大全(转载)

    http://blog.csdn.net/u013847120/article/details/52887813 本章列出了当你用任何主机语言调用MySQL时可能出现的错误.首先列出了服务器错误消息. ...

  5. SQLSERVER常用计数器

    复制下面全部--开始--运行--profmon.exe--性能监视器--粘贴计数器列表 <OBJECT ID="DISystemMonitor1" WIDTH="1 ...

  6. 用interrupt()中断Java线程

    最近在学习Java线程相关的东西,和大家分享一下,有错误之处欢迎大家指正. 假如我们有一个任务如下,交给一个Java线程来执行,如何才能保证调用interrupt()来中断它呢? class ATas ...

  7. DevOps,不是一个传说!

    转自: http://www.infoq.com/cn/articles/devops-not-legend DevOps最近成了热词,望文生义,你也能猜个八九不离十,它就是在说"研发团队& ...

  8. 7.12归来赛_B

    Prime Judge 时间限制 1000 ms 内存限制 65536 KB 题目描写叙述 众所周知.假设一个正整数仅仅能被1和自身整除,那么该数被称为素数.题目的任务非常easy.就是判定一个数是否 ...

  9. JS关于scrollTop和可视区域clientWidth

    一.scrollTop,scrollLeft 要获得页面的scrollTop及scrollLeft,在不同的浏览器中是不一样的: 谷歌浏览器和没声明DTD的文档,通过document.body.scr ...

  10. std::vector<char> 转 const char

    std::stringstream oss; for(unsigned int i=0;i < buffer->size();i++){ oss<<(*buffer)[i];  ...