1. 程式人生 > >jna模擬指標開闢空間,陣列首地址獲取值

jna模擬指標開闢空間,陣列首地址獲取值

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

}