0

原始工作 VB_Code

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 代码(简体)

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:\eclipse\workspace\FelmiReader\hs_err_pid5744.log

4

1 回答 1

1

乍一看,我怀疑问题是库存声明中的类型签名不正确。

如果参数是 ByRef,这意味着一个指针(在 C 中这将是 a*byte而不是 a byte)。JNA 有一个DoubleByReference您可能应该使用的类类型。第三个参数会有类似的问题(它实际上是一个 int*,而不是你编码的 int)。

作为一个仅供参考,您得到的本机崩溃应该在应用程序目录中留下一个转储文件。如果你打开它,你应该会找到发生故障时的本地调用——我敢打赌它是 lib.Inventory(tagdata[0], 1, taglen) 调用。

准确找出导致崩溃的调用将是追踪它的关键。

于 2010-04-15T05:34:24.633 回答