2017-04-16 4 views
1

Ich versuche, ein JNA api meine DLL-Funktion zu verwenden ist:Laden der DLL in Java - JNA

Int OpenComPort(int Port, unsigned char *ComAdr, unsigned char Baud, int* FrmHandle); 

Meine Java-Schnittstellen-Definition ist:

public int OpenComPort(int p, Pointer ComAdr, Pointer Baud, Pointer FrmHandle); 

Welche Art von Typ I haben in meiner Schnittstelle verwenden? Ist das Objekt "Zeiger" richtig?

+0

Wenn es möglich ist, verwenden Sie JNI über JNA. JNA ist Performance Killer. Ich denke, dass "Byte" in Java auf "unsigned char" gemappt werden könnte. –

+0

Sind Sie sicher, dass Sie die korrekte DLL-Funktionssignatur gepostet haben? Eine kurze Suche nach dieser Funktion und den Argumenten im Internet zeigt symbolische Symbole an, die Sie nicht angegeben haben. Diese sind wichtig, um Ihre Frage zu beantworten. –

Antwort

1

Durch die Verwendung der fett markiert Hervorhebung in Ihrer ursprünglichen Frage, die Post-Formatierung geschluckt Schlüsselinformationen in Ihrem Beitrag, so dass meine ursprüngliche Antwort ist nicht ganz richtig. Ich habe versucht, Ihren Beitrag zu bearbeiten und Ihre ursprüngliche Absicht wiederherzustellen, und habe meine Antwort entsprechend aktualisiert. Aufgrund der Überprüfung dieses Funktionsnamens in anderen DLLs, die ich in einer kurzen Suche gefunden habe, bin ich mir jedoch nicht sicher, ob Sie auch die Quell-DLL korrekt zitiert haben, insbesondere ob die Variable Baud auch ein Zeiger (*) ist.

Ihr erster Stop bei der Überprüfung korrekter Zuordnungen sollte the JNA documentation sein.

Für C-Zeiger-Typen funktioniert die JNA Pointer, erfordert jedoch, dass Sie viel mehr manuelle Arbeitsspeicherzuweisung durchführen, das Ergebnis lesen und dann die richtige Anzahl von Byte aus der Zeigeradresse lesen auswählen. Wenn der Typ des Zeigers wie in diesem Fall angegeben wird, sollten Sie das entsprechende -Mapping verwenden, das die Speicherzuweisung für Sie übernimmt und den "stark typisierten" Zugriff auf die Methode besser steuert.

Für Ihre unsigned char *ComAdr möchten Sie eine ByteByReference Zuordnung verwenden. Ähnlich für int * FrmHandle würden Sie IntByReference verwenden. Sie haben Baud als einfach unsigned char Typ aufgelistet, der direkt auf byte abbilden würde; andere APIs haben das aber auch als char *, also wäre es das gleiche ByteByReference Mapping. Beachten Sie, dass Java keine vorzeichenbehafteten Variablen verwendet. Daher müssen Sie zusätzliche Maßnahmen für negative Bytewerte ergreifen, sobald Sie sie aus den Rückgabewerten extrahieren, um sicherzustellen, dass sie dem vorzeichenlosen C-Wert entsprechen, z. B. & 0xff .