zoukankan      html  css  js  c++  java
  • [转]jna模拟指针开辟空间,数组首地址获取值

    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];
          }

    }

  • 相关阅读:
    xhtml+css (网站重构)
    一个典型的代码走查检查单
    谈谈单位时间内投票次数限制
    .NET性能优化方面的总结
    IE6.0、IE7.0 与 FireFox CSS
    vue3中使用 aggrid 表格组件
    基于predis高并发情况下实现频率控制的函数
    Redis之Centos下使用redis
    SVN的安装和使用
    Git配置教程
  • 原文地址:https://www.cnblogs.com/cuizhf/p/3703653.html
Copyright © 2011-2022 走看看