Die Java-Sprache definiert verschiedene Datentypen wie die Grundtypen int, doppelt usw. sowie das Objekt über Elternklassen aller Klassen usw. Dies sind Java-Ebenen-Typen, und der Verarbeitungsprozess unter Verwendung lokaler Methoden erfordert ihre entsprechenden Typen.
Die in der Java -Schicht geschriebenen nativen Methoden werden vom Compiler in Bytecode zusammengestellt. Der ByteCode zeichnet verschiedene Arten von Parametern in Klassendateien gemäß der Spezifikation auf, wie z. B. B Repräsentation von Byte, I repräsentiert int, j repräsentiert lang usw. Dann wird eine lokale Methode wie folgt als (ljava/lang/objekt; ii) v aufgezeichnet.
öffentliche statische native void -Test (Objekt O, int i, int i2);
Die entsprechenden Methoden oben sind in der JVM registriert. Bei der Ausführung der lokalen Methode wird der lokale Datentyp entsprechend der Typ-Karte konvertiert, z. B. int-> jint und Object-> Jobject. Tatsächlich sind INT und Jint in C ++ gleich. Verwenden Sie einfach Typedef, um einen anderen Namen zu definieren. Jobject ist ein Zeiger. Die Ausführungs -Engine erzeugt ein Objektobjekt, wenn die Java -Logik ausgeführt wird. Es verfügt über eine spezielle Datenstruktur in der JVM -Ebene. Das Jobject hier ist ein Zeiger auf diese Struktur. Wenn es verwendet werden muss, kann es in die Datenstruktur der JVM -Schicht gegossen und dann betrieben werden. Zusätzlich wird OOP in der JVM verwendet, um Objektzeiger darzustellen.
| Java -Typ | Einheimischer Typ | Wert |
|---|---|---|
| boolean | JBOOLEAN | wahr oder falsch |
| Byte | JByte | -128 ~ 127 |
| Kurz | Jshort | -Pow (2,15) ~ pow (2,15) -1 |
| int | Jint | -Pow (2,31) ~ pow (2,31) -1 |
| lang | Jlong | -Pow (2,63) ~ POW (2,63) -1 |
| schweben | Jfloat | IEEE754 Standard-Schwimmpunktzahl mit einer Präzision |
| doppelt | jdouble | IEEE754 Standard -Doppel -Präzisionsschwimmpunkt -Punktzahl |
| verkohlen | Jchar | 16-Bit-unsignierte Unicode-Zeichen |
Zusätzlich zum grundlegenden Typ -Mapping sind andere Objekttypen in der Java -Ebene Referenztypen, sodass die lokale Methode dem Jobjagdtyp entspricht. Darüber hinaus leitet es auch einige häufig verwendete Unterklassen wie JString, JClass usw. ab, wie folgt,
class _jobject {};class _jclass : public _jobject {};class _jthrowable : public _jobject {};class _jstring : public _jobject {};class _jrray : public _jobject {};class _jbooleanArray : public _jarray {};class _jbyteArray : public _jarray {}; class _jarArray: public _jarray {}; class _jshortArray: public _jarray {}; class _jintArray: public _jarray {}; class _jlongarray: public {{{_jdddddddddddd. _jdddddddddd. _jdddddddddely: public _jarray {}; class _jObjectArray: public _jarray {};Sie können sehen, dass die _jObject -Klasse definiert ist, eine leere Klasse, während andere Klassen _jclass _jthrowable _jstring _jarray enthalten, alle aus der _jobject -Klasse geerbt werden. Darüber hinaus leitet der Array -Typ auch 9 Unterklassen ab, die dem Basistyp -Array bzw. das Referenztyp -Array entsprechen.
Definieren Sie nach der Definition der Klasse den Zeiger -Alias. Hier ist die Art der lokalen Methode. Darüber hinaus sind dies C ++ - Definitionen. Wenn es sich um einen C -Compiler handelt, wird Struct verwendet, um _JObject, nicht die Klasse zu definieren.
typedef _jObject *Jobject; typedef _jclass *jclass; typedef _jthrowable *jThrowable; typedef _jstring *jstring; typedef _jarray *jrray; typedef _jbooleanarray *jBooleanray; typedef _jbytarray *jBytearray *jBytearray; *JCharArray; typedef _jshortArray *jShortArray; typedef _jintArray *jintArray; typedef _jlongarray *jlongarray; typedef _jfloatArray *jfloatArray; typedef _jdoubleary *jdoublearray; typedef _jobjowpectaRray;
Der obige Referenztyp ist als leere Klasse definiert. Hier verstehen wir die leere Klasse in C ++. Normalerweise müssen wir eine leere Klasse auf zwei Arten definieren.
Klasse leer {} struktur leer {}Nach der obigen Definition beträgt die Größe einer leeren Klasse 1, aber wie verwendet es eine leere Klasse, wenn es nichts gibt? Tatsächlich kann es verwendet werden, um verschiedene Objekte zu unterscheiden. Verschiedene Objekte, die durch leere Klassen definiert sind, haben unterschiedliche Adressen. Objekte, die mit Neuen betrieben werden, haben auch unterschiedliche Zeiger. Darüber hinaus können leere Klassen auch verschiedene Kategorien unterscheiden.
Wie verwenden wir diese Typ -Mappings in Verbindung? Es ist eigentlich sehr einfach. Die Antwort ist, Zeiger umzuwandeln. Wie bereits erwähnt, haben Objekte in der Java -Schicht eine bestimmte Datenstruktur in der JVM, dh OOP, um Objektzeiger darzustellen. Dann kann der Job wie folgt konvertiert werden, wo Handy der Jobtyp ist.
OOP result = *neu interpret_cast <OOP *> (Handle);
Es ist sehr bequem, es weiter zu verarbeiten, nachdem es in OOP konvertiert wurde. Wenn Sie beispielsweise einige klassenbezogene Metadaten erhalten möchten, können Sie Klas verwenden, um sie zu erhalten.
Oben haben die von der Java -Schicht definierten Typen entsprechende Datentypen in der lokalen Methode. Darüber hinaus wird der Quellcode für Java -Schicht in Bytecode kompiliert und speichert die Typen, die den lokalen Methodenparametern entsprechen. Bei der Ausführung des JVM kann der Typ, der der lokalen Methode entspricht, nach verschiedenen Typen konvertiert werden. Die nach der lokalen Methode definierten Typen sind alle leeren Klassen. Die Hauptfunktion besteht darin, Objekte zu binden und Objekttypen zu unterscheiden. Auf das Objekt oder die Klassenmetadaten können bei Bedarf durch Zeigerkonvertierung zugegriffen werden.