| 目次 | 前の項目 | 次の項目 | Java Native Interface 仕様 | 
この章では、JNI がどのように Java の型をネイティブ C の型にマッピングするかを解説します。
表 3-1 は、Java のプリミティブ型およびそれらのマシン依存のネイティブ型との対応について説明しています。
次の定義は、利便性のため提供されています。
jsize
整数型は、基本的な添字およびサイズを記述するために使用されます。
JNI には、各種の Java オブジェクトに対応する多くの参照型が含まれています。JNI 参照型は、図 3-1 に示すように、階層構造になっています。

C では、その他すべての JNI 参照型は、jobject と同じように定義されています。次に例を示します。
C++ では、JNI はダミークラスのセットを導入して、サブタイプ関係を強制します。次に例を示します。
class _jobject {}; 
class _jclass :public _jobject {}; 
... 
typedef _jobject *jobject; 
typedef _jclass *jclass; 
フィールドとメソッド ID は、次のように正規の C ポインタ型です。
struct _jfieldID; /* opaque structure */ typedef struct _jfieldID *jfieldID; /* field IDs */ struct _jmethodID; /* opaque structure */ typedef struct _jmethodID *jmethodID; /* method IDs */
jvalue
共用体型は、引数配列で要素型として使用されます。これは次のように宣言されます。
typedef union jvalue { 
jboolean z; 
jbyte    b; 
jchar    c; 
jshort   s; 
jint     i; 
jlong    j; 
jfloat   f; 
jdouble  d; 
jobject  l; 
} jvalue; 
JNI は、Java VM の型のシグニチャー表現を使用します。表 3-2 は、これらの型のシグニチャーを示しています。
| 型のシグニチャー
     | Java のデータ型
     | 
|---|---|
| Z
       | boolean
       | 
| B
       | byte
       | 
| C
       | char
       | 
| S
       | short
       | 
| I
       | int
       | 
| J
       | long
       | 
| F
       | float
       | 
| D
       | double
       | 
| L fully-qualified-class ;
       | 完全指定のクラス
       | 
| [ type
       | type[]
       | 
| ( arg-types ) ret-type
       | メソッドの型
       | 
たとえば、次の Java メソッドには、
次のような型のシグニチャーがあります。
JNI は変更された UTF-8 文字列を使用して各種の文字列型を表現します。変更された UTF-8 文字列は Java VM によって使用されるものと同じです。変更された UTF-8 文字列は、1 文字につき 1 バイトだけを使用して null 以外の ASCII 文字だけが含まれる文字シーケンスが表現できるようにコード化されており、すべての Unicode 文字を表現するすることができます。
次のように、\u0001 〜 \u007F の範囲にあるすべての文字が 1 バイトで表現されます。
|  |  | ||||||
バイトのうち 7 ビットのデータは、表現されている文字の値を示します。
null 文字 (\u000) および \u0080 〜 \u07FF
の範囲のすべての文字は、次のように x と y のバイトの組み合わせで表現されます。
x:
|  |  |  |  | ||||
|  |  |  | |||||
バイトは、((x &
0x1f) << 6) + (y & 0x3f)
という値で文字を表現します。
\u0800 〜 \uFFFF の文字は、x、y、z の 3 バイトで表現されます。
x:
|  |  |  |  |  | |||
|  |  |  | |||||
|  |  |  | |||||
((x & 0xf) << 12) + ((y & 0x3f)
<<
6) + (z & 0x3f) という値を持つ文字がバイトで表現されます。
コードポイントが U+FFFF より上の文字 (いわゆる「補助文字」) は、対応する UTF-16 表現の 2 つの代理コード単位を別々に符号化することで表現されます。代理コード単位は、それぞれ 3 バイトで表現されます。すなわち、補助文字は u、v、w、x、y、および z の 6 バイトで表現されます。
u:
|  |  |  |  |  |  |  |  | 
|  |  |  |  |  | |||
|  |  |  | |||||
|  |  |  |  |  |  |  |  | 
|  |  |  |  |  | |||
|  |  |  | |||||
値が 0x10000+((v&0x0f)<<16)+((w&0x3f)<<10)+(y&0x0f)<<6)+(z&0x3f) の文字は、6 バイトで表現されます。
複数バイト文字のバイトは、ビッグエンディアン (最初に高位のバイト) 順序で class
ファイルに格納されます。 
この形式と「標準」UTF-8 形式とでは、2 つの相違点があります。第一は、null 文字 (char)0
が、1 バイト形式でなく 2 バイト形式でコード化されていることです。このことは変更された UTF-8 文字列が null
を組み込むことがないことを意味します。第ニは、1 バイト、2 バイト、および 3 バイト形式の標準 UTF-8
だけが使用されていることです。Java VM は 4 バイト形式の標準 UTF-8 を認識しません。Java VM は独自の 2X3
バイト形式を使用します。
標準 UTF-8 形式の詳細については、「The Unicode Standard, Version 4.0」の「3.9 Unicode Encoding Forms」の項を参照してください。
| 目次 | 前の項目 | 次の項目 |  | 
Copyright © 2003 Sun Microsystems, Inc. All rights reserved.