Inhaltsverzeichnis
String
Puffer, Speicher, Arrays und Zeiger
Heim Java javaLernprogramm Javas JNA-Typzuordnung, Liebe zum Detail und zur Verwendung

Javas JNA-Typzuordnung, Liebe zum Detail und zur Verwendung

Apr 18, 2023 pm 05:07 PM
java jna

String

Die erste ist, dass die Zuordnung von String in JAVA tatsächlich zwei nativen Typen entspricht: const char* und const wchar_t*. Standardmäßig wird String in char* konvertiert.

char ist ein ANSI-Datentyp und wchar_t ist ein Unicode-Zeichendatentyp, auch Breitzeichen genannt.

Wenn die Unicode-Zeichen von JAVA in char-Arrays konvertiert werden sollen, müssen einige Codierungsvorgänge ausgeführt werden. Wenn jna.encoding festgelegt ist, wird die festgelegte Codierungsmethode zur Codierung verwendet. Standardmäßig ist die Kodierungsmethode „UTF8“.

Wenn es sich um WString handelt, können Unicode-Werte ohne Kodierung direkt nach WString kopiert werden.

Schauen wir uns zunächst ein einfaches Beispiel an:

char* returnStringArgument(char *arg) {
  return arg;
}

wchar_t* returnWStringArgument(wchar_t *arg) {
  return arg;
}
Nach dem Login kopieren

Der obige native Code kann abgebildet werden auf:

String returnStringArgument(String s);
WString returnWStringArgument(WString s);
Nach dem Login kopieren

Schauen wir uns noch einmal ein anderes Beispiel an, wenn die Definition der nativen Methode so lautet:

int getString(char* buffer, int bufsize);

int getUnicodeString(wchar_t* buffer, int bufsize);
Nach dem Login kopieren

Wir haben definiert zwei Methoden, method Die Parameter sind char* bzw. wchar_t*.

Schauen wir uns als Nächstes an, wie die Methodenzuordnung in JAVA definiert wird:

// Mapping A:
int getString(byte[] buf, int bufsize);
// Mapping B:
int getUnicodeString(char[] buf, int bufsize);
Nach dem Login kopieren

Das Folgende ist die spezifische Verwendung:

byte[] buf = new byte[256];
int len = getString(buf, buf.length);
String normalCString = Native.toString(buf);
String embeddedNULs = new String(buf, 0, len);
Nach dem Login kopieren

Einige Schüler fragen sich vielleicht, warum String in JAVA in char* konvertiert werden kann Hier Byte verwenden? Was ist mit Arrays?

Das liegt daran, dass die getString-Methode den Inhalt des eingehenden char-Arrays ändern muss, aber da String unveränderlich ist, kann String hier nicht direkt verwendet werden. Wir müssen ein Byte-Array verwenden.

Dann verwenden wir Native.toString(byte[]), um das Byte-Array in einen JAVA-String umzuwandeln.

Sehen wir uns einen anderen Rückgabewert an:

// Example A: Returns a C string directly
const char* getString();
// Example B: Returns a wide character C string directly
const wchar_t* getString();
Nach dem Login kopieren

Wenn die native Methode einen String direkt zurückgibt, können wir im Allgemeinen String für die Zuordnung verwenden:

// Mapping A
String getString();
// Mapping B
WString getString();
Nach dem Login kopieren

Wenn der native Code Speicherplatz für String zuweist, verwenden wir besser den Zeiger in Als Rückgabewert wird JNA verwendet, damit wir den belegten Speicherplatz irgendwann in der Zukunft freigeben können, wie unten gezeigt:

Pointer getString();
Nach dem Login kopieren

Puffer, Speicher, Arrays und Zeiger

Wann müssen wir Puffer und Speicher verwenden?

Wenn ein Array mit Basisdaten als Parameter an eine Funktion übergeben wird, können Sie im Allgemeinen stattdessen direkt ein Array mit Basisklassen in JAVA verwenden. Wenn die native Methode jedoch nach der Rückkehr der Methode weiterhin auf das Array zugreifen muss (Speichern des Zeigers auf das Array), ist es in diesem Fall nicht angemessen, das Array der Basisklasse zu verwenden. In diesem Fall müssen wir ByteBuffers oder verwenden Erinnerung .

Wir wissen, dass Arrays in JAVA Längen haben, aber bei nativen Methoden ist das zurückgegebene Array tatsächlich ein Zeiger auf das Array. Wir kennen die Länge des zurückgegebenen Arrays nicht. Wenn die native Methode also ein Array zurückgibt, gilt Folgendes: Es ist ungeeignet, Arrays für die Zuordnung im JAVA-Code zu verwenden. In diesem Fall muss Pointer verwendet werden. Schauen wir uns zunächst das Beispiel von Pointer an:

void* returnPointerArgument(void *arg) {
  return arg;
}

void* returnPointerArrayElement(void* args[], int which) {
  return args[which];
}
Nach dem Login kopieren

Das nächste ist die JAVA-Zuordnung:

Pointer returnPointerArgument(Pointer p);
Pointer returnPointerArrayElement(Pointer[] args, int which);
Nach dem Login kopieren

Basic Pointer: Sie können auch einen typisierten Zeiger anpassen, d

entspricht Puffer Im Allgemeinen stellt JAVA NIO viele Arten von Puffern bereit, z. B. ByteBuffer, ShortBuffer, IntBuffer, LongBuffer, FloatBuffer und DoubleBuffer usw. Hier nehmen wir ByteBuffer als Beispiel, um die spezifische Verwendung zu sehen.

Schauen Sie sich zunächst den nativen Code an:

public static class TestPointerType extends PointerType {
            public TestPointerType() { }
            public TestPointerType(Pointer p) { super(p); }
        }
TestPointerType returnPointerArrayElement(TestPointerType[] args, int which);
Nach dem Login kopieren

Der Puffer wird hier offensichtlich verwendet, daher ist die Verwendung eines Arrays unangemessen Hier können Sie ByteBuffer verwenden:

char* returnStringArrayElement(char* args[], int which) {
  return args[which];
}
wchar_t* returnWideStringArrayElement(wchar_t* args[], int which) {
  return args[which];
}
Nach dem Login kopieren

Dann schauen Sie sich an, wie man es verwendet:

String returnStringArrayElement(String[] args, int which);

WString returnWideStringArrayElement(WString[] args, int which);
Nach dem Login kopieren

Variable Parameter

Für native und JAVA selbst unterstützen beide variable Parameter. Lassen Sie uns ein Beispiel in der nativen Methode geben :

Die entsprechende JAVA-Methodenzuordnung von

int32_t fillInt8Buffer(int8_t *buf, int len, char value) {
  int i;

  for (i=0;i < len;i++) {
    buf[i] = value;
  }
  return len;
}
Nach dem Login kopieren

lautet wie folgt:

int fillInt8Buffer(ByteBuffer buf, int len, byte value);
Nach dem Login kopieren

Der entsprechende Aufrufcode lautet wie folgt:

TestLibrary lib = Native.load("testlib", TestLibrary.class);

        ByteBuffer buf  = ByteBuffer.allocate(1024).order(ByteOrder.nativeOrder());
        final byte MAGIC = (byte)0xED;
        lib.fillInt8Buffer(buf, 1024, MAGIC);
        for (int i=0;i < buf.capacity();i++) {
            assertEquals("Bad value at index " + i, MAGIC, buf.get(i));
        }
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonJavas JNA-Typzuordnung, Liebe zum Detail und zur Verwendung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Perfekte Zahl in Java Perfekte Zahl in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur perfekten Zahl in Java. Hier besprechen wir die Definition, Wie prüft man die perfekte Zahl in Java?, Beispiele mit Code-Implementierung.

Zufallszahlengenerator in Java Zufallszahlengenerator in Java Aug 30, 2024 pm 04:27 PM

Leitfaden zum Zufallszahlengenerator in Java. Hier besprechen wir Funktionen in Java anhand von Beispielen und zwei verschiedene Generatoren anhand ihrer Beispiele.

Weka in Java Weka in Java Aug 30, 2024 pm 04:28 PM

Leitfaden für Weka in Java. Hier besprechen wir die Einführung, die Verwendung von Weka Java, die Art der Plattform und die Vorteile anhand von Beispielen.

Smith-Nummer in Java Smith-Nummer in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

Fragen zum Java Spring-Interview Fragen zum Java Spring-Interview Aug 30, 2024 pm 04:29 PM

In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

Brechen oder aus Java 8 Stream foreach zurückkehren? Brechen oder aus Java 8 Stream foreach zurückkehren? Feb 07, 2025 pm 12:09 PM

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

Zeitstempel für Datum in Java Zeitstempel für Datum in Java Aug 30, 2024 pm 04:28 PM

Anleitung zum TimeStamp to Date in Java. Hier diskutieren wir auch die Einführung und wie man Zeitstempel in Java in ein Datum konvertiert, zusammen mit Beispielen.

Gestalten Sie die Zukunft: Java-Programmierung für absolute Anfänger Gestalten Sie die Zukunft: Java-Programmierung für absolute Anfänger Oct 13, 2024 pm 01:32 PM

Java ist eine beliebte Programmiersprache, die sowohl von Anfängern als auch von erfahrenen Entwicklern erlernt werden kann. Dieses Tutorial beginnt mit grundlegenden Konzepten und geht dann weiter zu fortgeschrittenen Themen. Nach der Installation des Java Development Kit können Sie das Programmieren üben, indem Sie ein einfaches „Hello, World!“-Programm erstellen. Nachdem Sie den Code verstanden haben, verwenden Sie die Eingabeaufforderung, um das Programm zu kompilieren und auszuführen. Auf der Konsole wird „Hello, World!“ ausgegeben. Mit dem Erlernen von Java beginnt Ihre Programmierreise, und wenn Sie Ihre Kenntnisse vertiefen, können Sie komplexere Anwendungen erstellen.

See all articles