Java言語は、基本タイプのINT、ダブルなど、すべてのクラスの親クラスオブジェクトなど、さまざまなデータ型を定義します。これらはJavaレベルのタイプであり、ローカルメソッドを使用した処理プロセスには対応するタイプが必要です。
Java層に記載されているネイティブメソッドは、コンパイラによってByteCodeにコンパイルされます。 bytecodeは、bはバイトを表す、iを表す、jを表す、jは長いなどを表すような、仕様に従ってさまざまなタイプのパラメーターをクラスファイルに記録します。次のようにローカルメソッドは(ljava/lang/object; ii)vとして記録されます。
public static native voidテスト(Object o、int i、int i2);
上記の対応する方法は、JVMに登録されています。ローカルメソッドを呼び出すために実行されると、ローカルデータ型は、int-> jintやobject-> jobjectなどのタイプマップに従って変換されます。実際、INTとJINTはC ++で同じです。TypeDEFを使用して別の名前を定義するだけです。 Jobjectはポインターです。実行エンジンは、Javaレイヤーロジックを実行するときにオブジェクトオブジェクトを生成します。 JVMレイヤーに特別なデータ構造があります。ここの雇用体は、この構造へのポインターです。使用する必要がある場合は、JVMレイヤーのデータ構造にキャストでき、その後操作できます。さらに、OOPはJVMでオブジェクトポインターを表すために使用されます。
| Javaタイプ | ネイティブタイプ | 価値 |
|---|---|---|
| ブール | jboolean | 真または偽 |
| バイト | jbyte | -128〜127 |
| 短い | jshort | -POW(2,15)〜POW(2,15)-1 |
| int | ジント | -POW(2,31)〜POW(2,31)-1 |
| 長さ | jlong | -POW(2,63)〜POW(2,63)-1 |
| フロート | jfloat | IEEE754標準の単一精度フローティングポイント番号 |
| ダブル | jdouble | IEEE754標準のダブル精度フローティングポイント番号 |
| char | jchar | 16ビットの符号なしのユニコード文字 |
基本型マッピングに加えて、Javaレイヤーの他のオブジェクトタイプは参照タイプであるため、ローカル方法はJobjectタイプに対応します。さらに、次のように、JString、JClassなどの一般的に使用されるサブクラスも導き出されます。
class _jobject {}; class _jclass:public _jobject {}; class _jthrowable:public _jobject {}; class _jString:public _jobject {}; class _jrray:public _jobject {}; class _jboolaray:public _jarray _jbyrray _jbyray _jarray {}; class _jchararray:public _jarray {}; class _jshortarray:public _jarray {}; class _jintarray:public _jarray {}; class _jlongarray:public _jarray {}; class _jfloatarray _Jdouray _Jdouray :public _jarray {}; class _jobjectArray:public _jarray {};_jobjectクラスが定義されていることがわかります。これは空のクラスであり、他のクラスには_jclass _jthrowable _jrarrayが含まれ、すべて_jobjectクラスから継承されています。さらに、アレイタイプは、それぞれベースタイプアレイと参照タイプアレイに対応する9つのサブクラスを導き出します。
クラスを定義した後、ポインターエイリアスを定義します。ローカルメソッドのタイプは次のとおりです。さらに、これらはC ++定義です。 Cコンパイラの場合、structを使用してクラスではなく_jobjectを定義します。
typedef _jobject *jobject; typedef _jclass *jclass; typedef _jthrowable *jlowable; typedef _jstring *jstring; typedef _jarray *jrray; typedef _jbooleanarray *jbooleanarray; typedef *jbytearray; jbytearray; Jbytearray; *jChararray; typedef _jshortarray *jshortarray; typedef _jintarray *jintarray; typedef _jlongarray *jlongarray; typedef _jfloatarray *jfloatarray; typedef _jdoublearray *jdoublearay; typedef _jobumjectarray;
上記の参照タイプは、空のクラスとして定義されます。ここでは、C ++の空のクラスを理解しています。通常、空のクラスを次の2つの方法で定義する必要があります。
class empty {} struct empty {}上記の定義の後、空のクラスのサイズは1ですが、何もない場合、空のクラスの使用は何ですか?実際、異なるオブジェクトを区別するために使用できます。空のクラスで定義された異なるオブジェクトには、アドレスが異なります。 Newを使用して動作するオブジェクトには、異なるポインターもあります。さらに、空のクラスは異なるカテゴリを区別することもできます。
では、これらのタイプマッピングを関連してどのように使用しますか?実際には非常に簡単です。答えは、ポインターを変換することです。前述のように、Java層のオブジェクトにはJVMに特定のデータ構造があります。つまり、OOPを使用してオブジェクトポインターを表します。その後、ジョブは次のように変換できます。ここで、ハンドルはジョブタイプです。
ooop result = *reinterpret_cast <ooop *>(handle);
OOPに変換した後、さらに処理することは非常に便利です。たとえば、クラス関連のメタデータを取得したい場合は、Klassを使用して取得できます。
上記では、Javaレイヤーによって定義されたタイプには、ローカルメソッドに対応するデータ型があります。さらに、JavaレイヤーソースコードはByteCodeにコンパイルされ、ローカルメソッドパラメーターに対応するタイプを保存します。 JVMを実行する場合、ローカルメソッドに対応するタイプは、異なるタイプに従って変換できます。ローカルメソッドで定義されたタイプはすべて空のクラスです。主な機能は、オブジェクトをバインドし、オブジェクトタイプを区別することです。必要に応じて、オブジェクトまたはクラスメタデータにポインター変換を介してアクセスできます。