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 \ worksheet \ FelmiReader\hs_err_pid5744.logとして保存されます。

4

1 に答える 1

1

一見すると、問題はInventory宣言の型署名が正しくないことだと思います。

パラメーターがByRefの場合、それはポインターを意味します(Cでは、これはの*byte代わりになりますbyte)。JNAには、DoubleByReferenceおそらく使用する必要のあるクラスタイプがあります。3番目のパラメーターでも同様の問題が発生します(これは実際にはint *であり、コーディングしたintではありません)。

参考までに、発生するネイティブクラッシュは、アプリケーションディレクトリにダンプファイルを残す必要があります。それを開くと、障害が発生したときに存在していたネイティブ呼び出しが見つかるはずです。これはlib.Inventory(tagdata [0]、1、taglen)呼び出しだったと思います。

どの呼び出しがクラッシュを引き起こしているのかを正確に把握することが、それを追跡するための鍵となります。

于 2010-04-15T05:34:24.633 に答える