2010-04-15 19 views
0

原工作VB_Code我能指點我嗎我做錯了什麼?嘗試使用JNA訪問庫

Private Declare Function ConnectReader Lib "rfidhid.dll"() As Integer 
Private Declare Function DisconnectReader Lib "rfidhid.dll"() As Integer 
Private Declare Function SetAntenna Lib "rfidhid.dll" (ByVal mode As Integer) As Integer 
Private Declare Function Inventory Lib "rfidhid.dll" (ByRef tagdata As Byte, ByVal mode As Integer, ByRef taglen As Integer) As Integer 

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    Dim desc As String 
    desc = "1. Click ""Connect"" to talk to reader." & vbCr & vbCr 
    desc &= "2. Click ""RF On"" to wake up the TAG." & vbCr & vbCr 
    desc &= "3. Click ""Read Tag"" to get tag PCEPC." 
    lblDesc.Text = desc 
End Sub 

Private Sub cmdConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdConnect.Click 
    If cmdConnect.Text = "Connect" Then 
     If ConnectReader() Then 
      cmdConnect.Text = "Disconnect" 
     Else 
      MsgBox("Unable to connect to RFID Reader. Please check reader connection.") 
     End If 
    Else 
     If DisconnectReader() Then 
      cmdConnect.Text = "Connect" 
     End If 
    End If 
End Sub 

Private Sub cmdRF_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdRF.Click 
    If cmdRF.Text = "RF On" Then 
     If SetAntenna(&HFF) Then 
      cmdRF.Text = "RF Off" 
     End If 
    Else 
     If SetAntenna(&H0) Then 
      cmdRF.Text = "RF On" 
     End If 
    End If 
End Sub 

Private Sub cmdReadTag_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdReadTag.Click 
    Dim tagdata(64) As Byte 
    Dim taglen As Integer, cnt As Integer 
    Dim pcepc As String 
    pcepc = "" 
    If Inventory(tagdata(0), 1, taglen) Then 
     For cnt = 0 To taglen - 1 
      pcepc &= tagdata(cnt).ToString("X2") 
     Next 
     txtPCEPC.Text = pcepc 
    Else 
     txtPCEPC.Text = "ReadError" 
    End If 

End Sub 

Java代碼的(簡體),以VB映射到Java

import com.sun.jna.Library; 
import com.sun.jna.Native; 

public class HelloWorld { 
public interface MyLibrary extends Library { 
    public int ConnectReader(); 
    public int SetAntenna (int mode); 
    public int Inventory (byte tagdata, int mode, int taglen); 

} 

public static void main(String[] args) { 
MyLibrary lib = (MyLibrary) Native.loadLibrary("rfidhid", MyLibrary.class); 

System.out.println(lib.ConnectReader()); 

System.out.println(lib.SetAntenna(255)); 
byte[] tagdata = new byte[64]; 

int taglen = 0; 
int cnt; 
String pcepc; 
pcepc = ""; 

if (lib.Inventory(tagdata[0], 1, taglen) == 1) { 
    for (cnt = 0; cnt < taglen; cnt++) 
     pcepc += String.valueOf(tagdata[cnt]);   
} 
} 
} 

運行lib.Inventory時發生錯誤。 lib.Inventory用於從RFID閱讀器獲取標籤。如果沒有標籤,則沒有錯誤。

錯誤代碼

An unexpected error has been detected by Java Runtime Environment: 

EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0b1d41ab, pid=5744, tid=4584 

Java VM: Java HotSpot(TM) Client VM (11.2-b01 mixed mode windows-x86) 
Problematic frame: 
C [rfidhid.dll+0x141ab] 

更多信息的錯誤報告文件保存爲: C:\日食\工作區\ FelmiReader \ hs_err_pid5744.log

回答

1

乍一看,我懷疑問題是庫存聲明中的錯誤類型簽名。

如果參數是ByRef,則表示指針(在C中,這將是*byte而不是byte)。 JNA有一個DoubleByReference類的類型,你可能應該使用。第三個參數(它實際上是一個int *,而不是你編寫的int)會有類似的問題。

作爲供參考,您正在獲取的本機崩潰應該在應用程序目錄中保留一個轉儲文件。如果你打開這個電話,你應該找到發生故障時的本地電話 - 我會打賭錢是lib.Inventory(tagdata [0],1,taglen)電話。

搞清楚究竟是哪一個電話造成了這次死機是追蹤它的關鍵。

+0

是的,它通過引用傳遞。我想知道如何在Java中做到這一點。我嘗試使用字節和整數和簽名,但它不起作用。 – henry 2010-04-15 05:37:17

+0

哈 - 當您發表評論時,我正在擴大一點。 DoubleByReference應該做到這一點。 – 2010-04-15 05:38:46

+0

將簽名更改爲 public int Inventory(byte [] tagdata,int mode,IntByReference taglen); 我意識到API所說的字節是一個數組,因此默認情況下它是通過引用傳遞的。謝謝! – henry 2010-04-15 05:55:33