| 目次 | 前の項目 | 次の項目 | 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 オブジェクト
java.lang.Throwable Object obj
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 オブジェクトを割り当てます。オブジェクトに対する参照を返します。
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() を呼び出すことによって取得しなければなりません。
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
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
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
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 インタフェースポインタ
NULL を返します。
void ReleaseStringUTFChars(JNIEnv *env, jstring string,
const char *utf);
ネイティブコードが utf へのアクセスをもはや必要としていないことを VM に知らせます。utf 引数は、GetStringUTFChars() を使用して string から取得することができるポインタです。
env: JNI インタフェースポインタ
jsize GetArrayLength(JNIEnv *env, jarray array);
env: JNI インタフェースポインタ
jarray NewObjectArray(JNIEnv *env, jsize length,
jclass elementClass, jobject initialElement);
クラス elementClass にオブジェクトを持つ新しい配列を構築します。要素はすべて、最初に initialElement に設定されます。
env: JNI インタフェースポインタ
NULL を返します。
OutOfMemoryError: システムがメモリ不足の場合
jobject GetObjectArrayElement(JNIEnv *env,
jobjectArray array, jsize index);
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 (C) 1996, 1997 Sun Microsystems, Inc.
All rights reserved
コメントの送付先: jni@java.sun.com