目次 | 前の項目 | 次の項目 | Java Native Interface 仕様 |
この章は、JNI の関数のリファレンスです。 この章では、JNI の関数をすべて取り上げます。 また、JNI 関数テーブルの配置そのままに記載されています。
「しなければならない」(または「する必要がある」) という表現は、JNI プログラマに対する制約を表していることに注意してください。 たとえば、ある JNI 関数について、それが null 以外のオブジェクトを受け取ら「なければならない」と説明されている場合、プログラマの責任において、その JNI 関数に null を渡さないようにしなければならないという意味になります。 それによって、JNI 実装の際に、その JNI 関数における null のポインタチェックを行う必要がなくなります。
この章の一部は NetscapeTM の JRI ドキュメントから改作したものです。
参照資料は、関数を用途によってグループ化しています。 参照セクションは、次の機能分野から構成されています。
typedef const struct JNINativeInterface *JNIEnv;VM は、コード例 4-1 に示されているように関数テーブルを初期化します。 最初の 3 エントリは、将来の COM との互換性のために予約されていることに注意してください。 さらに、関数テーブルの始めの近辺にいくつかの追加の
null
エントリを予約してあります。したがって、たとえば、これから現われる、クラス関連の JNI 演算は、表の終わりではなく FindClass のあとに追加することができます。
関数テーブルは、すべての JNI インタフェースポインタの間で共用されることに注意してください。
jint GetVersion(JNIEnv *env);
env
: JNI インタフェースポインタ
JDK 1.1 では、GetVersion()
が 0x00010001 を返します。
jclass DefineClass(JNIEnv *env, jobject loader,
const jbyte *buf, jsize bufLen);
env
: JNI インタフェースポインタ
loader
: 定義されたクラスに割り当てられるクラスローダ
null
を返します。
ClassFormatError
: クラスデータが有効なクラスを指定しなかった場合
ClassCircularityError
: クラスまたはインタフェースが、それ自体のスーパークラスまたはスーパーインタフェースになる場合
OutOfMemoryError
: システムがメモリ不足の場合
jclass FindClass(JNIEnv *env, const char *name);
この関数は、局所的に定義されたクラスをロードします。 また、指定された名前を持つクラスに対して CLASSPATH
環境変数が指定するディレクトリおよび ZIP ファイルを検索します。
env
: JNI インタフェースポインタ
name
: 完全修飾クラス名 (「/
」で区切ったあとにクラス名を付けたパッケージ名)。 その名前が「[
」(配列シグニチャー文字) で開始されている場合は、配列クラスを返します。
null
を返します。
ClassFormatError
: クラスデータが有効なクラスを指定しなかった場合
ClassCircularityError
: クラスまたはインタフェースが、それ自体のスーパークラスまたはスーパーインタフェースになる場合
NoClassDefFoundError
: 要求されたクラスまたはインタフェースに対する定義が見つからなかった場合
OutOfMemoryError
: システムがメモリ不足の場合
jclass GetSuperclass(JNIEnv *env, jclass clazz);
clazz
がクラス Object
以外のクラスを表す場合、この関数は、clazz
によって指定されたクラスのスーパークラスを表すオブジェクトを返します。
clazz
がクラス Object
を指定する場合、または、clazz
がインタフェースを表す場合は、この関数は null
を返します。
env
: JNI インタフェースポインタ
clazz
によって表されるクラスのスーパークラスまたは null
を返します。
jboolean IsAssignableFrom(JNIEnv *env, jclass clazz1,
jclass clazz2);
clazz1
のオブジェクトが安全に clazz2
へキャストされるかどうかを決定します。
env
: JNI インタフェースポインタ
JNI_TRUE
を返します。
jint Throw(JNIEnv *env, jthrowable obj);
java.lang.Throwable
オブジェクトがスローされます。
env
: JNI インタフェースポインタ
obj
: java.lang.Throwable
オブジェクト
jint ThrowNew(JNIEnv *env, jclass clazz,
const char *message);
message
によって指定されたメッセージを使用して、指定されたクラスから例外オブジェクトを構築し、その例外がスローされるようにします。
env
: JNI インタフェースポインタ
clazz
: java.lang.Throwable
のサブクラス
message
: java.lang.Throwable
オブジェクトの構築に使用するメッセージ
java.lang.Throwable
オブジェクト
jthrowable ExceptionOccurred(JNIEnv *env);
例外がスローされるかどうかを決定します。 例外は、ネイティブコードが ExceptionClear()
を呼び出すか、または Java コードがその例外を処理するまでスローされた状態を続けます。
env
: JNI インタフェースポインタ
null
を返します。
void ExceptionDescribe(JNIEnv *env);
stderr
など、例外およびスタックのバックトレースをシステムエラーのレポーティングチャネルにプリントします。 これは、デバッグのために提供されている便利なルーチンです。
env
: JNI インタフェースポインタ
void ExceptionClear(JNIEnv *env);
現在スローされている例外があればそれをクリアします。 現在スローされている例外がない場合は、このルーチンは影響を及ぼしません。
env
: JNI インタフェースポインタ
void FatalError(JNIEnv *env, const char *msg);
致命的エラーを発生させます。VM による回復は期待されません。 この関数は値を返しません。
env
: JNI インタフェースポインタ
jobject NewGlobalRef(JNIEnv *env, jobject obj);
obj
引数によって参照されたオブジェクトの新しいグローバル参照を作成します。 obj
引数は、グローバル参照またはローカル参照のどちらでも構いません。 グローバル参照は、DeleteGlobalRef()
を呼び出すことによって、必ず明示的に処理しておく必要があります。
env
: JNI インタフェースポインタ
null
を返します。
void DeleteGlobalRef(JNIEnv *env, jobject globalRef);
globalRef
によって示されたグローバル参照を削除します。
env
: JNI インタフェースポインタ
void DeleteLocalRef(JNIEnv *env, jobject localRef);
localRef
によって示されたローカル参照を削除します。
env
: JNI インタフェースポインタ
jobject AllocObject(JNIEnv *env, jclass clazz);
オブジェクト用としてコンストラクタを呼び出さずに、新しい Java オブジェクトを割り当てます。 オブジェクトに対する参照を返します。
clazz
引数は、配列クラスを参照してはなりません。
env
: JNI インタフェースポインタ
null
を返します。
InstantiationException
: クラスがインタフェースまたは abstract クラスの場合
OutOfMemoryError
: システムがメモリ不足の場合
jobject NewObject(JNIEnv *env, jclass clazz,
jmethodID methodID, ...);
jobject NewObjectA(JNIEnv *env, jclass clazz,
jmethodID methodID, jvalue *args);
jobject NewObjectV(JNIEnv *env, jclass clazz,
jmethodID methodID, va_list args);
Java オブジェクトを構築します。 メソッド ID は、呼び出すべきコンストラクタメソッドを表しています。 この ID は、メソッド名として <init>
を、また戻り値の型として void
(V
) を使用して GetMethodID()
を呼び出すことによって取得しなければなりません。
clazz
引数は、配列クラスを参照してはなりません。
methodID
引数のすぐあとに置きます。 NewObject()
は、これらの引数を受け取り、プログラマが呼び出したい Java メソッドに渡します。
methodID
引数のすぐあとに続く jvalues
の args
配列内に置きます。 NewObjectA()
はこの配列内の引数を受け取り、プログラマが呼び出したい Java メソッドに渡します。
methodID
引数のすぐあとに続く型 va_list
の args
引数内に置きます。 NewObjectV()
はこれらの引数を受け取り、プログラマが呼び出したい Java メソッドに渡します。
env
: JNI インタフェースポインタ
args
: コンストラクタの引数の配列
args
: コンストラクタの引数の va_list
null
を返します。
InstantiationException
: クラスがインタフェースまたは abstract クラスの場合
OutOfMemoryError
: システムがメモリ不足の場合
jclass GetObjectClass(JNIEnv *env, jobject obj);
env
: JNI インタフェースポインタ
obj
: Java オブジェクト (null
であってはならない)
jboolean IsInstanceOf(JNIEnv *env, jobject obj,
jclass clazz);
オブジェクトがクラスのインスタンスであるかどうかをチェックします。
env
: JNI インタフェースポインタ
obj
を clazz
にキャストすることができる場合は、JNI_TRUE
を返します。 そうでない場合は、 JNI_FALSE
を返します。 null
オブジェクトは、どのクラスにもキャストすることができます。
jboolean IsSameObject(JNIEnv *env, jobject ref1,
jobject ref2);
2 つの参照が同じ Java オブジェクトを参照するかどうかをテストします。
env
: JNI インタフェースポインタ
ref1
と ref2
が同じ Java オブジェクトを参照する場合、または、両方が null
である場合は、JNI_TRUE
を返します。 それ以外の場合は、JNI_FALSE
を返します。
jfieldID GetFieldID(JNIEnv *env, jclass clazz,
const char *name, const char *sig);
クラスのインスタンス (非 static) フィールドを表すフィールド ID を返します。 このフィールドは、その名前とシグニチャーで指定します。 アクセス用関数の Get<type>Field ファミリと Set<type>Field ファミリは、フィールド ID を使用してオブジェクトフィールドを取り出します。
GetFieldID()
によって、まだ初期化されていないクラスが初期化されます。
配列の長さフィールドを得るために GetFieldID()
を使用することはできません。 代わりに、 GetArrayLength()
を使用してください。
env
: JNI インタフェースポインタ
name
: 0 で終了する UTF-8 文字列内のフィールド名
sig
: 0 で終了する UTF-8 文字列内のフィールドシグニチャー
null
を返します。
NoSuchFieldError
: 指定されたフィールドが見つからない場合
ExceptionInInitializerError
: 例外のため、クラス初期化が失敗した場合
OutOfMemoryError
: システムがメモリ不足の場合
Get<type>Field(JNIEnv *env, jobject obj,
jfieldID fieldID);
このアクセス用ルーチンのファミリは、オブジェクトのインスタンス (非 static) フィールドの値を返します。 アクセスすべきフィールドは、 GetFieldID()
を呼び出すことによって得られるフィールド ID を使用して指定します。
次の表には、Get<type>Field ルーチン名と結果の型が示されています。 Get<type>Field 内の type をフィールドの Java 型と置き換えるか、あるいは表の実際のルーチン名の 1 つを使用して、NativeType をそのルーチンに対応するネイティブ型と置き換える必要があります。
env
: JNI インタフェースポインタ
obj
: Java オブジェクト (null
であってはならない)
void
Set<type>Field(JNIEnv *env, jobject obj, jfieldID fieldID,
NativeType value);
このアクセス用ルーチンのファミリは、オブジェクトのインスタンス (非 static) フィールドの値を設定します。 アクセスすべきフィールドは、 GetFieldID()
を呼び出すことによって得られるフィールド ID を使用して指定します。
次の表には、Set<type>Field ルーチン名と値の型が示されています。 Set<type>Field 内の type をフィールドの Java 型と置き換えるか、あるいは表の実際のルーチン名の 1 つを使用して、NativeType をそのルーチンに対応するネイティブ型と置き換える必要があります。
env
: JNI インタフェースポインタ
obj
: Java オブジェクト (null
であってはならない)
jmethodID GetMethodID(JNIEnv *env, jclass clazz,
const char *name, const char *sig);
クラスまたはインタフェースのインスタンス (非 static) メソッドを表すメソッド ID を返します。 このメソッドは、clazz
のスーパークラスの 1 つの中で定義し、clazz
によって継承できます。 このメソッドは、その名前およびシグニチャーによって決定されます。
GetMethodID()
によって、まだ初期化されていないクラスが初期化されます。
コンストラクタのメソッド ID を取得するには、メソッド名として <init>
を指定し、戻り値の型として void
(V
) を指定します。
env
: JNI インタフェースポインタ
name
: 0 で終了する UTF-8 文字列内のメソッド名
sig
: 0 で終了する UTF-8 文字列内のメソッドシグニチャー
null
を返します。
NoSuchMethodError
: 指定されたメソッドが見つからない場合
ExceptionInInitializerError
: 例外のため、クラス初期化が失敗した場合
OutOfMemoryError
: システムがメモリ不足の場合
Call<type>Method(JNIEnv *env, jobject obj,
jmethodID methodID, ...);
NativeType
Call<type>MethodA(JNIEnv *env, jobject obj,
jmethodID methodID, jvalue *args);
NativeType
Call<type>MethodV(JNIEnv *env, jobject obj,
jmethodID methodID, va_list args);
これら 3 種類の演算ファミリは、ネイティブメソッドから Java インスタンスメソッドを呼び出す際に使用されます。これら 3 種類のファミリは、呼び出したメソッドにパラメータを渡す機構が異なるだけです。
これらの演算ファミリは、指定されたメソッド ID に従って、Java オブジェクト上のインスタンス (非 static) メソッドを呼び出します。methodID
引数は、GetMethodID()
を呼び出すことによって取得する必要があります。
これらの関数を private メソッドやコンストラクタを呼び出すために使用する場合は、メソッド ID を obj
の実クラスのスーパークラスの 1 つからではなく、実クラス自体から導き出す必要があります。
methodID
引数のすぐあとに置きます。 Call<type>Method ルーチンは、これらの引数を受け取り、プログラマが呼び出したい Java メソッドに渡します。
methodID
引数のすぐあとに続く jvalues
の args
配列内に置きます。 Call<type>MethodA ルーチンはこの配列内の引数を受け取り、プログラマが呼び出したい Java メソッドに渡します。
methodID
引数のすぐあとに続く型 va_list
の args
引数内に置きます。 Call<type>MethodV ルーチンは、引数を受け取り、プログラマが呼び出したい Java メソッドに渡します。
次の表には、メソッド呼び出しルーチンの各々がその結果の型に応じて示されています。 Call<type>Method 内の type を、呼び出しているメソッドの Java 型と置き換え (または、表の実際のメソッド呼び出しルーチン名の 1 つを使用する)、かつ NativeType をそのルーチンに対応するネイティブ型と置き換える必要があります。
env
: JNI インタフェースポインタ
args
: 引数の配列
args
: 引数の va_list
CallNonvirtual<type>Method(JNIEnv *env, jobject obj,
jclass clazz, jmethodID methodID, ...);
NativeType
CallNonvirtual<type>MethodA(JNIEnv *env, jobject obj,
jclass clazz, jmethodID methodID, jvalue *args);
NativeType
CallNonvirtual<type>MethodV(JNIEnv *env, jobject obj,
jclass clazz, jmethodID methodID, va_list args);
これらの演算ファミリは、指定されたクラスおよびメソッド ID に従って、Java オブジェクト上のインスタンス (非 static) メソッドを呼び出します。methodID
引数は、クラス clazz
に対して GetMethodID()
を呼び出すことによって取得する必要があります。
CallNonvirtual<type>Method ルーチンファミリと Call<type>Method ルーチンファミリとは異なります。 Call<type>Method ルーチンは、オブジェクトのクラスに基づいてメソッドを呼び出しますが、CallNonvirtual<type>Method ルーチンは、メソッド ID を取得できるクラス (clazz
パラメータによって指定) に基づいてメソッドを呼び出します。 メソッド ID は、このオブジェクトの実クラスまたはその実クラスのスーパークラスの 1 つから取得しなければなりません。
methodID
引数のすぐあとに置きます。 CallNonvirtual<type>Method ルーチンは、これらの引数を受け取り、プログラマが呼び出したい Java メソッドに渡します。
methodID
引数のすぐあとに続く jvalues
の args
配列内に置きます。 CallNonvirtual<type>MethodA ルーチンはこの配列内の引数を受け取り、プログラマが呼び出したい Java メソッドに渡します。
methodID
引数のすぐあとに続く型 va_list
の args
引数内に置きます。 CallNonvirtualMethodV ルーチンはこれらの引数を受け取り、プログラマが呼び出したい Java メソッドに渡します。
次の表には、メソッド呼び出しルーチンの各々がその結果の型に応じて示されています。 CallNonvirtual<type>Method 内の type をメソッドの Java 型と置き換えるか、あるいは表の実際のメソッド呼び出しルーチン名の 1 つを使用して、NativeType をそのルーチンに対応するネイティブ型と置き換える必要があります。
env
: JNI インタフェースポインタ
args
: 引数の配列
args
: 引数の va_list
Java メソッドを実行している間に発生した例外
jfieldID GetStaticFieldID(JNIEnv *env, jclass clazz,
const char *name, const char *sig);
クラスの static フィールドを表すフィールド ID を返します。 このフィールドは、その名前とシグニチャーで指定します。 アクセス用関数の GetStatic<type>Field ファミリと SetStatic<type>Field ファミリは、フィールド ID を使用して static フィールドを取り出します。
GetStaticFieldID()
によって、まだ初期化されていないクラスが初期化されます。
env
: JNI インタフェースポインタ
name
: 0 で終了する UTF-8 文字列内の static フィールド
sig
: 0 で終了する UTF-8 文字列内のフィールドシグニチャー
null
を返します。
NoSuchFieldError
: 指定された static フィールドが見つからない場合
ExceptionInInitializerError
: 例外のため、クラス初期化が失敗した場合
OutOfMemoryError
: システムがメモリ不足の場合
GetStatic<type>Field(JNIEnv *env, jclass clazz,
jfieldID fieldID);
このアクセス用ルーチンのファミリは、オブジェクトの static フィールドを返します。 アクセスするフィールドは、フィールド ID で指定します。 フィールド ID は、GetStaticFieldID()
を呼び出すことによって取得することができます。
次の表には、 get ルーチン名のファミリと結果の型が示されています。 GetStatic<type>Field 内の type をフィールドの Java 型と置き換えるか、あるいは表の実際の static フィールドアクセス用ルーチン名の 1 つを使用して、NativeType をそのルーチンに対応するネイティブ型と置き換える必要があります。
env
: JNI インタフェースポインタ
void
SetStatic<type>Field(JNIEnv *env, jclass clazz,
jfieldID fieldID,
NativeType value);
このアクセス用ルーチンのファミリは、オブジェクトの static フィールドの値を設定します。 アクセスするフィールドは、フィールド ID で指定します。 フィールド ID は、GetStaticFieldID()
を呼び出すことによって取得することができます。
次の表には、セットルーチン名と値の型が示されています。 SetStatic<type>Field 内の type をフィールドの Java 型と置き換えるか、あるいは表の実際のセット static フィールドルーチン名の 1 つを使用して、NativeType をそのルーチンに対応するネイティブ型と置き換える必要があります。
env
: JNI インタフェースポインタ
jmethodID GetStaticMethodID(JNIEnv *env, jclass clazz,
const char *name, const char *sig);
クラスの static メソッドを表すメソッド ID を返します。 このメソッドは、その名前とシグニチャーで指定します。
GetStaticMethodID()
によって、まだ初期化されていないクラスが初期化されます。
env
: JNI インタフェースポインタ
name
: 0 で終了する UTF-8 文字列内の static メソッド名
sig
: 0 で終了する UTF-8 文字列内のメソッドシグニチャー
null
を返します。
NoSuchMethodError
: 指定された static メソッドが見つからない場合
ExceptionInInitializerError
: 例外のため、クラス初期化が失敗した場合
OutOfMemoryError
: システムがメモリ不足の場合
CallStatic<type>Method(JNIEnv *env, jclass clazz,
jmethodID methodID, ...);
NativeType
CallStatic<type>MethodA(JNIEnv *env, jclass clazz,
jmethodID methodID, jvalue *args);
NativeType
CallStatic<type>MethodV(JNIEnv *env, jclass clazz,
jmethodID methodID, va_list args);
この演算ファミリは、指定されたメソッド ID に従って、Java オブジェクト上の static メソッドを呼び出します。methodID
引数は、GetStaticMethodID()
を呼び出すことによって取得する必要があります。
メソッド ID は、clazz
のスーパークラスの 1 つからではなく、clazz
自体から導き出す必要があります。
methodID
引数のすぐあとに置かなければなりません。 CallStatic<type>Method ルーチンは、これらの引数を受け取り、プログラマが呼び出したい Java メソッドに渡します。
methodID
引数のすぐあとに続く jvalues
の args
配列内に置かなければなりません。 CallStaticMethodA ルーチンはこの配列内の引数を受け取り、プログラマが呼び出したい Java メソッドに渡します。
methodID
引数のすぐあとに続く型 va_list
の args
引数内に置かなければなりません。 CallStaticMethodV はこれらの引数を受け取り、プログラマが呼び出したい Java メソッドに渡します。
次の表には、メソッド呼び出しルーチンが各々その結果の型によって示されています。 CallStatic<type>Method 内の type をメソッドの Java 型または表の実際のメソッド呼び出しルーチン名の 1 つと置き換えるか、NativeType をそのルーチンに対応するネイティブ型と置き換える必要があります。
env
: JNI インタフェースポインタ
args
: 引数の配列
args
: 引数の va_list
Java メソッドを実行している間に発生した例外
jstring NewString(JNIEnv *env, const jchar *unicodeChars,
jsize len);
Unicode 文字配列から新しい java.lang.String
オブジェクトを構築します。
env
: JNI インタフェースポインタ
unicodeChars
: Unicode 文字列を参照するポインタ
null
を返します。
OutOfMemoryError
: システムがメモリ不足の場合
jsize GetStringLength(JNIEnv *env, jstring string);
Java 文字列の長さ (Unicode 文字のカウント) を返します。
env
: JNI インタフェースポインタ
const jchar * GetStringChars(JNIEnv *env, jstring string,
jboolean *isCopy);
文字列の Unicode 文字の配列を参照するポインタを返します。 このポインタは、ReleaseStringchars()
が呼び出されるまで有効です。
isCopy
が null
ではない場合にコピーが作成されると、*isCopy
は JNI_TRUE
に設定されます。コピーが作成されない場合は、JNI_FALSE
に設定されます。
env
: JNI インタフェースポインタ
null
を返します。
void ReleaseStringChars(JNIEnv *env, jstring string,
const jchar *chars);
ネイティブコードが chars
へのアクセスをもはや必要としていないことを VM に知らせます。 chars
引数は、GetStringChars()
を使用してstring
から取得することができるポインタです。
env
: JNI インタフェースポインタ
jstring NewStringUTF(JNIEnv *env, const char *bytes);
UTF-8 文字の配列から新しい java.lang.String
オブジェクトを構築します。
env
: JNI インタフェースポインタ
null
を返します。
OutOfMemoryError
: システムがメモリ不足の場合
jsize GetStringUTFLength(JNIEnv *env, jstring string);
env
: JNI インタフェースポインタ
const char* GetStringUTFChars(JNIEnv *env, jstring string,
jboolean *isCopy);
UTF-8 文字の文字列配列を参照するポインタを返します。 この配列は、ReleaseStringUTFChars()
によって解放されるまで有効です。
isCopy
が null
ではない場合にコピーが作成されると、*isCopy
は JNI_TRUE
に設定されます。コピーが作成されない場合は、JNI_FALSE
に設定されます。
env
: JNI インタフェースポインタ
void ReleaseStringUTFChars(JNIEnv *env, jstring string,
const char *utf);
ネイティブコードが utf
へのアクセスをもはや必要としていないことを VM に知らせます。 utf
引数は、GetStringUTFChars()
を使用して string
から取得することができるポインタです。
env
: JNI インタフェースポインタ
jsize GetArrayLength(JNIEnv *env, jarray array);
env
: JNI インタフェースポインタ
jobjectArray NewObjectArray(JNIEnv *env, jsize length,
jclass elementClass, jobject initialElement);
クラス elementClass
にオブジェクトを持つ新しい配列を構築します。 要素はすべて、最初に initialElement
に設定されます。
env
: JNI インタフェースポインタ
null
を返します。
OutOfMemoryError
: システムがメモリ不足の場合
jobject GetObjectArrayElement(JNIEnv *env,
jobjectArray array, jsize index);
Object
配列の要素を返します。
env
: JNI インタフェースポインタ
ArrayIndexOutOfBoundsException
: index
が配列内に有効な添字の値を指定しなかった場合
void SetObjectArrayElement(JNIEnv *env, jobjectArray array,
jsize index, jobject value);
オブジェクト
配列の要素を設定します。
env
: JNI インタフェースポインタ
ArrayIndexOutOfBoundsException
: index
が配列内に有効な添字の値を指定しなかった場合
ArrayStoreException
: value
のクラスが、配列の要素クラスのサブクラスではない場合
New<PrimitiveType>Array(JNIEnv *env, jsize length);
新しいプリミティブ配列オブジェクトを構築するために使用される演算のファミリ。 表 4-8 には、特定のプリミティブ配列コンストラクタが示されています。 New<PrimitiveType>Array を、次の表の実際のプリミティブ配列コンストラクタルーチン名の 1 つと置き換え、ArrayType をそのルーチンに対応する配列型と置き換える必要があります。
env
: JNI インタフェースポインタ
null
を返します。
*
Get<PrimitiveType>ArrayElements(JNIEnv *env,
ArrayType array, jboolean *isCopy);
プリミティブ配列の本体を返す関数のファミリです。 その結果は、対応する Release<PrimitiveType>ArrayElements() 関数が呼び出されるまで有効です。 返された配列は Java 配列のコピーである場合もあるため、その返された配列に加えられている変更は、Release<PrimitiveType>ArrayElements() が呼び出されるまでは、必ずしも元の array
に反映されているとは限りません。
isCopy
が null
ではない場合にコピーが作成されると、*isCopy
は JNI_TRUE
に設定されます。 コピーが作成されない場合は、JNI_FALSE
に設定されます。
次の表には、特定のプリミティブ配列要素アクセス機能が示されています。 次の置換を行う必要があります。
GetBooleanArrayElements()
は常に jbooleans
を参照するポインタを返してきます。 各バイトが 1 つの要素を表しています (アンパック表示)。 その他の型の配列はすべて、メモリ内で必ず隣接するようになっています。
env
: JNI インタフェースポインタ
null
を返します。
void
Release<PrimitiveType>ArrayElements(JNIEnv *env,
ArrayType array,
NativeType *elems, jint mode);
ネイティブコードが elems
へのアクセスをもはや必要としていないことを VM に知らせる関数のファミリです。 elems
引数は、対応する Get<
PrimitiveType>
ArrayElements() 関数を使用して、array
から導き出されるポインタです。 必要に応じて、この関数は、 elems
に施された変更をすべて元の配列にコピーし直します。
mode
引数は、配列バッファの解放方法に関する情報を提供します。 mode
は、elems
が array
内の要素のコピーではない場合は、影響を及ぼしません。 mode
が array
内の要素のコピーである場合は、次の表に示されているような影響を及ぼします。
モード | 動作 |
---|---|
0
| 内容をコピーバックし、elems バッファを解放する
|
JNI_COMMIT
| 内容をコピーバックするが、elems バッファを解放しない
|
JNI_ABORT
| 変更の可能性があってもその変更をコピーバックせずに、バッファを解放する |
多くの場合、プログラマは、ピン配列とコピー配列の両方に対して一貫した動作を保証するために、「0」 を mode
引数に渡します。 0 以外を渡す場合は、プログラマはメモリを十分に注意して管理する必要があります。
次の表には、プリミティブ配列処置機能のファミリを構成する特定のルーチンが示されています。 次の置換を行う必要があります。
env
: JNI インタフェースポインタ
Get<PrimitiveType>ArrayRegion(JNIEnv *env,
ArrayType array,
jsize start, jsize len,
NativeType *buf);
プリミティブ配列の領域をバッファにコピーする機能のファミリです。
次の表には、特定のプリミティブ配列要素アクセス機能が示されています。 次の置換を行う必要があります。
env
: JNI インタフェースポインタ
ArrayIndexOutOfBoundsException
: 領域内の添字の 1 つでも有効ではない場合
void
Set<PrimitiveType>ArrayRegion(JNIEnv *env,
ArrayType array,
jsize start, jsize len,
NativeType *buf);
バッファからのプリミティブ配列の領域をコピーバックする機能のファミリです。
次の表には、特定のプリミティブ配列要素アクセス機能が示されています。 次の置換を行う必要があります。
env
: JNI インタフェースポインタ
ArrayIndexOutOfBoundsException
: 領域内の添字の 1 つでも有効ではない場合
jint RegisterNatives(JNIEnv *env, jclass clazz,
const JNINativeMethod *methods, jint nMethods);
clazz
引数によって指定されたクラスでネイティブメソッドを登録します。 methods
パラメータは、そのネイティブメソッドの名前、シグニチャー、関数ポインタを含む JNINativeMethod
構造体の配列を指定します。 nMethods
パラメータは、配列内のネイティブメソッドの数を指定します。 JNINativeMethod
構造体は次のように定義されます。
typedef struct { char *name; char *signature; void *fnPtr; } JNINativeMethod;関数ポインタは、形式上、次のシグニチャーを備えている必要があります。
ReturnType (*fnPtr)(JNIEnv *env, jobject objectOrClass, ...);
env
: JNI インタフェースポインタ
NoSuchMethodError
: 指定されたメソッドが見つからなかった場合、または、そのメソッドがネイティブではなかった場合
jint UnregisterNatives(JNIEnv *env, jclass clazz);
あるクラスのネイティブメソッドの登録を抹消します。 そのクラスは、そのネイティブメソッド機能にリンクされる前または再登録される前の状態に戻ります。
この関数は、通常のネイティブコードでは使用するべきではありません。 その代わりに、特別なプログラムにネイティブライブラリを再ロードしたり再リンクしたりする方法を提供します。
env
: JNI インタフェースポインタ
jint MonitorEnter(JNIEnv *env, jobject obj);
obj
によって参照される基底の Java オブジェクトに関連するモニターに入ります。
Java オブジェクトは、それぞれ、関連するモニターを持っています。 現在のスレッドがすでに obj
に関連するモニターを持つ場合は、このスレッドがモニターに入った回数を表すモニター内のカウンタが増加されます。 obj
に関連するモニターがどのスレッドにも所有されていない場合は、現在のスレッドがそのモニターの所有者となり、このモニターのエントリカウントを 1 に設定します。別のスレッドがすでに obj
に関連するモニターを所有している場合、現在のスレッドはモニターが解放されるのを待ち、再度、所有権を獲得しようとします。
env
: JNI インタフェースポインタ
obj
: 通常の Java オブジェクトまたはクラスオブジェクト
jint MonitorExit(JNIEnv *env, jobject obj);
現在のスレッドは、obj
によって参照された基底の Java オブジェクトに関連するモニターの所有者でなければなりません。 このスレッドは、このモニターに入った回数を表すカウンタを減少させます。 カウンタの値がゼロになると、現在のスレッドはモニターを解放します。
env
: JNI インタフェースポインタ
obj
: 通常の Java オブジェクトまたはクラスオブジェクト
jint GetJavaVM(JNIEnv *env, JavaVM **vm);
現在のスレッドに関連する Java VM インタフェース (呼び出し API で使用) を返します。 その結果は、2 番目の引数 vm
で示された位置に置かれます。
env
: JNI インタフェースポインタ
Java Native Interface 仕様 (1997 年 3 月 15 日に dkramer によって生成された HTML)
Copyright © 1996, 1997 Sun Microsystems, Inc. All rights reserved
コメントや訂正は、jni@java.sun.com までお送りください。