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

    }

  • 相关阅读:
    pig安装
    [2013.10.29][Luogu OJ P1873]砍树
    [转帖]OIer之魂、
    [转帖]我们是OIer、
    10007:[2013.10.25]P1.滚土豆(potato.pas/c/cpp)
    [2013.10.18]P2.传作业 (pass.pas/c/cpp)
    [Luogu OJ P1619]解一元二次方程的烦恼
    [Luogu OJ P1433][2013.10.18]DFS基础题-吃奶酪
    高精度加减乘法小程序 Ver 0.9.5 beta
    [2013.10.11]P3.和为零
  • 原文地址:https://www.cnblogs.com/cuizhf/p/3703653.html
Copyright © 2011-2022 走看看