[{"@context":"http:\/\/schema.org\/","@type":"BlogPosting","@id":"https:\/\/wiki.edu.vn\/wiki19\/2021\/01\/27\/java-native-interface-wikipedia\/#BlogPosting","mainEntityOfPage":"https:\/\/wiki.edu.vn\/wiki19\/2021\/01\/27\/java-native-interface-wikipedia\/","headline":"Java Native Interface – Wikipedia","name":"Java Native Interface – Wikipedia","description":"before-content-x4 Im Software-Design ist die Java Native Interface ((JNI) ist ein Programmierframework f\u00fcr Fremdfunktionsschnittstellen, mit dem Java-Code, der in einer","datePublished":"2021-01-27","dateModified":"2021-01-27","author":{"@type":"Person","@id":"https:\/\/wiki.edu.vn\/wiki19\/author\/lordneo\/#Person","name":"lordneo","url":"https:\/\/wiki.edu.vn\/wiki19\/author\/lordneo\/","image":{"@type":"ImageObject","@id":"https:\/\/secure.gravatar.com\/avatar\/44a4cee54c4c053e967fe3e7d054edd4?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/44a4cee54c4c053e967fe3e7d054edd4?s=96&d=mm&r=g","height":96,"width":96}},"publisher":{"@type":"Organization","name":"Enzyklop\u00e4die","logo":{"@type":"ImageObject","@id":"https:\/\/wiki.edu.vn\/wiki4\/wp-content\/uploads\/2023\/08\/download.jpg","url":"https:\/\/wiki.edu.vn\/wiki4\/wp-content\/uploads\/2023\/08\/download.jpg","width":600,"height":60}},"image":{"@type":"ImageObject","@id":"https:\/\/wiki.edu.vn\/wiki4\/wp-content\/uploads\/2023\/08\/download.jpg","url":"https:\/\/wiki.edu.vn\/wiki4\/wp-content\/uploads\/2023\/08\/download.jpg","width":100,"height":100},"url":"https:\/\/wiki.edu.vn\/wiki19\/2021\/01\/27\/java-native-interface-wikipedia\/","wordCount":2261,"articleBody":" (adsbygoogle = window.adsbygoogle || []).push({});before-content-x4Im Software-Design ist die Java Native Interface ((JNI) ist ein Programmierframework f\u00fcr Fremdfunktionsschnittstellen, mit dem Java-Code, der in einer Java Virtual Machine (JVM) ausgef\u00fchrt wird, aufgerufen und von aufgerufen werden kann[1] native Anwendungen (Programme, die f\u00fcr eine Hardware- und Betriebssystemplattform spezifisch sind) und Bibliotheken, die in anderen Sprachen wie C, C ++ und Assembly geschrieben sind. (adsbygoogle = window.adsbygoogle || []).push({});after-content-x4Table of ContentsZiele[edit]Zuordnungstypen[edit]Performance[edit]Alternativen[edit]Siehe auch[edit]Verweise[edit]Literaturverzeichnis[edit]Externe Links[edit]Ziele[edit]Mit JNI k\u00f6nnen Programmierer native Methoden schreiben, um Situationen zu behandeln, in denen eine Anwendung nicht vollst\u00e4ndig in der Java-Programmiersprache geschrieben werden kann, z. B. wenn die Standard-Java-Klassenbibliothek die plattformspezifischen Funktionen oder die Programmbibliothek nicht unterst\u00fctzt. Es wird auch verwendet, um eine vorhandene Anwendung (in einer anderen Programmiersprache geschrieben) so zu \u00e4ndern, dass sie f\u00fcr Java-Anwendungen zug\u00e4nglich ist. Viele der Standardbibliotheksklassen h\u00e4ngen von JNI ab, um dem Entwickler und dem Benutzer Funktionen bereitzustellen, z. B. Datei-E \/ A und Soundfunktionen. Durch die Aufnahme leistungs- und plattformabh\u00e4ngiger API-Implementierungen in die Standardbibliothek k\u00f6nnen alle Java-Anwendungen sicher und plattformunabh\u00e4ngig auf diese Funktionalit\u00e4t zugreifen.Mit dem JNI-Framework kann eine native Methode Java-Objekte genauso verwenden, wie Java-Code diese Objekte verwendet. Eine native Methode kann Java-Objekte erstellen und diese Objekte dann untersuchen und zur Ausf\u00fchrung ihrer Aufgaben verwenden. Eine native Methode kann auch Objekte untersuchen und verwenden, die mit Java-Anwendungscode erstellt wurden. (adsbygoogle = window.adsbygoogle || []).push({});after-content-x4Nur Anwendungen und signierte Applets k\u00f6nnen JNI aufrufen.Eine Anwendung, die auf JNI basiert, verliert die von Java angebotene Plattformportabilit\u00e4t (eine teilweise Problemumgehung besteht darin, f\u00fcr jede Plattform eine separate Implementierung von JNI-Code zu schreiben und Java das Betriebssystem erkennen und zur Laufzeit das richtige laden zu lassen).Native Code-Schnittstelle kann nicht nur mit Java verbunden werden, sondern auch auf Java CanvasDies ist mit der Java AWT Native Interface m\u00f6glich. Der Prozess ist fast der gleiche, mit nur wenigen \u00c4nderungen. Die native Java AWT-Schnittstelle ist erst seit J2SE 1.3 verf\u00fcgbar.JNI erm\u00f6glicht auch den direkten Zugriff auf Assembly-Code, ohne eine C-Br\u00fccke zu durchlaufen.[2] Auf die gleiche Weise ist auch der Zugriff auf Java-Anwendungen von der Assembly aus m\u00f6glich.[3] (adsbygoogle = window.adsbygoogle || []).push({});after-content-x4Im JNI-Framework werden native Funktionen in separaten .c- oder .cpp-Dateien implementiert. (C ++ bietet eine etwas einfachere Schnittstelle zu JNI.) Wenn die JVM die Funktion aufruft, \u00fcbergibt sie a JNIEnv Zeiger, a jobject Zeiger und alle von der Java-Methode deklarierten Java-Argumente. Im Folgenden wird beispielsweise eine Java-Zeichenfolge in eine native Zeichenfolge konvertiert:extern \"C\"JNIEXPORT void JNICALL Java_ClassName_MethodName (JNIEnv *env, jobject obj, jstring javaString){ const char *nativeString = env->GetStringUTFChars(javaString, 0); \/\/Do something with the nativeString env->ReleaseStringUTFChars(javaString, nativeString);}Das env Der Zeiger ist eine Struktur, die die Schnittstelle zur JVM enth\u00e4lt. Es enth\u00e4lt alle Funktionen, die f\u00fcr die Interaktion mit der JVM und die Arbeit mit Java-Objekten erforderlich sind. Beispiel JNI-Funktionen sind das Konvertieren nativer Arrays in \/ von Java-Arrays, das Konvertieren nativer Zeichenfolgen in \/ von Java-Zeichenfolgen, das Instanziieren von Objekten, das Ausl\u00f6sen von Ausnahmen usw. Grunds\u00e4tzlich kann alles verwendet werden, was Java-Code tun kann JNIEnv, wenn auch mit erheblich geringerer Leichtigkeit.Das Argument obj ist ein Verweis auf das Java-Objekt, in dem diese native Methode deklariert wurde.Native Datentypen k\u00f6nnen Java-Datentypen zugeordnet werden. F\u00fcr zusammengesetzte Typen wie Objekte, Arrays und Zeichenfolgen muss der native Code die Daten explizit konvertieren, indem Methoden in der aufgerufen werden JNIEnv.Ein JNI-Umgebungszeiger (JNIEnv *) wird als Argument f\u00fcr jede native Funktion \u00fcbergeben, die einer Java-Methode zugeordnet ist, wodurch die Interaktion mit der JNI-Umgebung innerhalb der nativen Methode erm\u00f6glicht wird. Dieser JNI-Schnittstellenzeiger kann gespeichert werden, bleibt jedoch nur im aktuellen Thread g\u00fcltig. Andere Threads m\u00fcssen zuerst aufrufen AttachCurrentThread () um sich an die VM anzuschlie\u00dfen und einen JNI-Schnittstellenzeiger zu erhalten. Nach dem Anh\u00e4ngen funktioniert ein nativer Thread wie ein normaler Java-Thread, der innerhalb einer nativen Methode ausgef\u00fchrt wird. Der native Thread bleibt mit der VM verbunden, bis er aufgerufen wird DetachCurrentThread () sich abl\u00f6sen.[4]Das JNI-Framework bietet keine automatische Speicherbereinigung f\u00fcr Nicht-JVM-Speicherressourcen, die durch Code zugewiesen werden, der auf der nativen Seite ausgef\u00fchrt wird. Folglich \u00fcbernimmt nativer Seitencode (z. B. Assemblersprache) die Verantwortung f\u00fcr die explizite Freigabe solcher Speicherressourcen, die der native Code erh\u00e4lt.Wenn sich der native Code auf Linux- und Solaris-Plattformen als Signalhandler registriert, kann er Signale abfangen, die f\u00fcr die JVM bestimmt sind. Mithilfe einer Verantwortungskette kann nativer Code besser mit der JVM zusammenarbeiten. Auf Windows-Plattformen kann SEH (Structured Exception Handling) verwendet werden, um nativen Code in SEH-Try \/ Catch-Bl\u00f6cke zu verpacken, um von Maschinen (CPU \/ FPU) generierte Software-Interrupts (z. B. Verst\u00f6\u00dfe gegen den NULL-Zeigerzugriff und Operationen zum Teilen durch Null) zu erfassen ) und diese Situationen zu behandeln, bevor der Interrupt wieder in die JVM (dh Java-Seitencode) \u00fcbertragen wird, was aller Wahrscheinlichkeit nach zu einer nicht behandelten Ausnahme f\u00fchrt.[original research?]Die f\u00fcr die Funktionen NewStringUTF, GetStringUTFLength, GetStringUTFChars, ReleaseStringUTFChars und GetStringUTFRegion verwendete Codierung lautet “UTF-8 ge\u00e4ndert”.[5] Das ist nicht f\u00fcr alle Eingaben UTF-8 g\u00fcltig, aber wirklich eine andere Codierung. Das Nullzeichen (U + 0000) und die Codepunkte, die sich nicht in der mehrsprachigen Grundebene befinden (gr\u00f6\u00dfer oder gleich U + 10000, dh diejenigen, die als dargestellt sind Ersatzpaare in UTF-16) sind in modifiziertem UTF-8 unterschiedlich codiert. Viele Programme verwenden diese Funktionen tats\u00e4chlich falsch und behandeln die zur\u00fcckgegebenen oder an die Funktionen \u00fcbergebenen UTF-8-Zeichenfolgen als Standard-UTF-8-Zeichenfolgen anstelle von modifizierten UTF-8-Zeichenfolgen. Programme sollten die Funktionen NewString, GetStringLength, GetStringChars, ReleaseStringChars, GetStringRegion, GetStringCritical und ReleaseStringCritical verwenden, die UTF-16LE-Codierung f\u00fcr Little-Endian-Architekturen und UTF-16BE f\u00fcr Big-Endian-Architekturen verwenden, und dann UTF-16 f\u00fcr UTF-16 verwenden 8 Konvertierungsroutine.[original research?]Zuordnungstypen[edit]Die folgende Tabelle zeigt die Zuordnung von Typen zwischen Java (JNI) und nativem Code.C TypJava-SprachtypBeschreibungTyp Signaturvorzeichenloser charjbooleanvorzeichenlose 8 BitsZ.signiertes Zeichenjbyte8 Bit signiertB.unsigned shortjcharvorzeichenlose 16 BitC.kurzjshort16 Bit signiertS.langejintvorzeichenbehaftete 32 Bitichlang Lang__int64jlong64 Bit signiertJ.schwebenjfloat32 BitF.doppeltjdouble64 BitD.LeereV.Dar\u00fcber hinaus die Unterschrift \"L fully-qualified-class\u00a0;\" w\u00fcrde die Klasse bedeuten, die durch diesen Namen eindeutig spezifiziert ist; zB die Unterschrift \"Ljava\/lang\/String;\" bezieht sich auf die Klasse java.lang.String. Auch Pr\u00e4fix [ to the signature makes the array of that type; for example, [I means the int array type. Finally, a void signature uses the V code.These types are interchangeable. One can use jint where you normally use an int, and vice versa, without any typecasting required. However, mapping between Java Strings and arrays to native strings and arrays is different. If a jstring is used where a char * would be, the code could crash the JVM.[original research?]Performance[edit]JNI verursacht unter bestimmten Umst\u00e4nden erhebliche Gemeinkosten und Leistungseinbu\u00dfen:[6]Funktionsaufrufe an JNI-Methoden sind teuer, insbesondere wenn eine Methode wiederholt aufgerufen wird.Native Methoden werden weder von der JVM eingebunden, noch kann die Methode JIT-kompiliert werden, da die Methode bereits kompiliert ist.Ein Java-Array kann f\u00fcr den Zugriff in nativem Code kopiert und sp\u00e4ter zur\u00fcckkopiert werden. Die Kosten k\u00f6nnen in der Gr\u00f6\u00dfe des Arrays linear sein.Wenn der Methode ein Objekt \u00fcbergeben wird oder ein R\u00fcckruf erforderlich ist, f\u00fchrt die native Methode wahrscheinlich eigene Aufrufe an die JVM durch. Der Zugriff auf Java-Felder, -Methoden und -Typen \u00fcber den nativen Code erfordert etwas \u00c4hnliches wie Reflektion. Signaturen werden in Zeichenfolgen angegeben und von der JVM abgefragt. Dies ist sowohl langsam als auch fehleranf\u00e4llig.Java-Strings sind Objekte, haben eine L\u00e4nge und sind codiert. F\u00fcr den Zugriff auf oder das Erstellen einer Zeichenfolge ist m\u00f6glicherweise eine O (n) -Kopie erforderlich.Alternativen[edit]Microsofts propriet\u00e4re Implementierung einer Java Virtual Machine (Visual J ++) hatte einen \u00e4hnlichen Mechanismus zum Aufrufen von nativem Code aus Java, den so genannten Raw Native Interface ((RNI). Dar\u00fcber hinaus war es einfach, vorhandenen nativen Code aufzurufen, der Java selbst nicht kannte, wie beispielsweise die aufgerufene Windows-API (ohne darauf beschr\u00e4nkt zu sein) J \/ Direct. Nach dem Sun-Microsoft-Rechtsstreit \u00fcber diese Implementierung wird Visual J ++ jedoch nicht mehr beibehalten.Die Verwendung von RNI war weniger umst\u00e4ndlich als die von JNI, da keine Buchhaltung mit einem Java-Umgebungszeiger erforderlich war. Stattdessen konnte direkt auf alle Java-Objekte zugegriffen werden. Um dies zu erleichtern, wurde ein Tool verwendet, das Header-Dateien aus Java-Klassen generiert. In \u00e4hnlicher Weise war J \/ Direct einfacher zu verwenden als die erforderliche native Zwischenbibliothek und JNI, obwohl JNA derzeit eine Alternative ist.[original research?]Siehe auch[edit]Verweise[edit]Literaturverzeichnis[edit]Externe Links[edit] (adsbygoogle = window.adsbygoogle || []).push({});after-content-x4"},{"@context":"http:\/\/schema.org\/","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"https:\/\/wiki.edu.vn\/wiki19\/#breadcrumbitem","name":"Enzyklop\u00e4die"}},{"@type":"ListItem","position":2,"item":{"@id":"https:\/\/wiki.edu.vn\/wiki19\/2021\/01\/27\/java-native-interface-wikipedia\/#breadcrumbitem","name":"Java Native Interface – Wikipedia"}}]}]