Java JNA und Cardreader

neojade

Grünschnabel
Hallo,

ich versuche im Moment mittels JNA und der DLL eines Kartenleseres(Scard32.dll) auf selbigen zuzugreifen und Karten auszulesen bzw. zu beschreiben. Allerdings scheitere ich daran die Rückgabewerte des Kartenlesers richtig zu verarbeiten. Im Moment wir der Befehl der in cmd steht an den Kartenleser geschickt der fröhlich blinkt und als Ergebnis bekomme ich nur eine Ausgabe der Art [B@14a9972 (Pointer?), der echte Rückgabewert wäre "active" also Status des Kartenlesers. Der Kartenleser ist ein SCM chipdrive micro pro mit dazugehörigem Treiber. Weiß vielleicht jemand wie ich an den richtigen Rückgabewert komme ? Vielen Dank schonmal.

Code:
package jnative;

import java.nio.ByteBuffer;

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


public class Scard {

    // This is the standard, stable way of mapping, which supports extensive
    // customization and mapping of Java to native types.
    public interface Scard32 extends Library {
    	Scard32 INSTANCE = (Scard32)Native.loadLibrary(("C:\\windows\\system32\\SCARD32.dll"), Scard32.class);
        public int SCardComand(Long Handle, String cmd, Long CmdLen, String DataIn, Long DataInLen, ByteBuffer DataOut, Long DataOutLen);
        
    }

    public static void main(String[] args) {
        long Handle = 0;
        String cmd = "Card,Info,Status";
        //String cmd = "Card,MemRead,128,6";
        long CmdLen = 16; 
        String DataIn = ""; 
        long DataInLen= 0; 
        
        byte[] bytetest ;
        bytetest = new byte[50];
        long DataOutLen = 255;
    	        
       
        ByteBuffer bbin  = ByteBuffer.wrap(bytetest);

        try{
        	Scard32.INSTANCE.SCardComand(Handle, cmd, CmdLen, DataIn, DataInLen, DataOut, DataOutLen);
		String DataOut = Native.toString(bytetest); 
		System.out.println(bytetest);
		System.out.println(DataOut);
		
        } catch(UnsatisfiedLinkError e){
        	e.printStackTrace();
        }
        
    }
}

Hier noch das selbe in VBA wo es einwandfrei funktioniert, vielleicht hilft es ja.

Code:
Declare Function SCardComand Lib "SCARD32.dll" _
  (Handle As Long, ByVal cmd As String, CmdLen As Long, _
  ByVal DataIn As String, DataInLen As Long, _
  ByVal DataOut As String, DataOutLen As Long) As Long

Function KartePruefen()
D = String(255, 0)
SCardComand 0, "Card,Info,Status", 0, nil, 0, D, 255
MsgBox(D)
End Function
 
Das was du hier bekommst ist der Rückgabewert der Methode toString aus der Klasse Object.
Es muss einen Getter für den Wert geben. Wenn du die Klasse editieren und neu compilieren kannst, kannst du auch toString überschreiben und einen String deiner Wahl zurückgeben lassen.
 
Zurück