| 目次 | 前の項目 | 次の項目 | 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 文字だけが含まれる文字シーケンスが表現できるようにコード化されており、16 ビットまでの文字を表現するすることができます。次のように、\u0001〜\u007F の範囲のすべての文字が 1 バイトで表現されます。
バイトのうち 7 ビットのデータは、表現されている文字の値を示します。null 文字 (\u000) および \u0080〜\u07FF の範囲のすべての文字は、次のように x と y の一対のバイトで表現されます。
このバイトは、((x&0x1f)<<6)+(y&0x3f) の値で文字を表現します。
\u0800〜\uFFFF の範囲の文字は、次のように x、y および z の 3 バイトで表現されます。
値が ((x&0xf)<<12)+((y&0x3f)<<6)+(z&0x3f) の文字は 3 バイトで表現されます。
この形式と「標準」UTF-8 形式とでは、2 つの相違点があります。第一は、null バイト (byte)0 が、1 バイト形式でなく 2 バイト形式でコード化されていることです。このことは Java VM UTF-8 文字列が null を組み込むことがないことを意味します。第ニは、1 バイト、2 バイト、および 3 バイト形式だけが使用されていることです。Java VM はこれより長い UTF-8 形式を認識しません。
| 目次 | 前の項目 | 次の項目 |
Copyright © 2003 Sun Microsystems, Inc. All rights reserved.