目次 | 前の項目 | 次の項目 | Java Native Interface 仕様 |
この章は、JNI の関数のリファレンスです。この章では、JNI の関数をすべて取り上げます。また、JNI 関数テーブルの配置そのままに記載されています。
「しなければならない」(または「する必要がある」) という表現は、JNI プログラマに対する制約を表していることに注意してください。たとえば、ある JNI 関数について、それが null 以外のオブジェクトを受け取ら「なければならない」と説明されている場合、プログラマの責任において、その JNI 関数に null を渡さないようにしなければならないという意味になります。それによって、JNI 実装の際に、その JNI 関数における null のポインタチェックを行う必要がなくなります。
この章の一部は Netscape の JRI ドキュメントから改作したものです。
参照資料は、関数を用途によってグループ化しています。参照セクションは、次の機能分野から構成されています。
各関数には、JNIEnv 引数を介し、固定オフセットでアクセスすることが可能です。JNIEnv 型は、すべての JNI 関数のポインタを格納する構造体を指すポインタです。これは次のように定義されます。
VM は、コード例 4-1
に示されているように関数テーブルを初期化します。最初の 3 エントリは、将来の COM
との互換性のために予約されていることに注意してください。さらに、関数テーブルの始めの近辺にいくつかの追加の null
エントリを予約してあります。したがって、たとえば、これから現われる、クラス関連の JNI
演算は、表の終わりではなく FindClass のあとに追加することができます。
関数テーブルは、すべての JNI インタフェースポインタの間で共用されることに注意してください。
const struct JNINativeInterface ... = { = {
null,
null,
null,
null,
GetVersion,
DefineClass,
FindClass,
FromReflectedMethod,
FromReflectedField,
ToReflectedMethod,
GetSuperclass,
IsAssignableFrom,
ToReflectedField,
Throw,
ThrowNew,
ExceptionOccurred,
ExceptionDescribe,
ExceptionClear,
FatalError,
PushLocalFrame,
PopLocalFrame,
NewGlobalRef,
DeleteGlobalRef,
DeleteLocalRef,
IsSameObject,
NewLocalRef,
EnsureLocalCapacity,
AllocObject,
NewObject,
NewObjectV,
NewObjectA,
GetObjectClass,
IsInstanceOf,
GetMethodID,
CallObjectMethod,
CallObjectMethodV,
CallObjectMethodA,
CallBooleanMethod,
CallBooleanMethodV,
CallBooleanMethodA,
CallByteMethod,
CallByteMethodV,
CallByteMethodA,
CallCharMethod,
CallCharMethodV,
CallCharMethodA,
CallShortMethod,
CallShortMethodV,
CallShortMethodA,
CallIntMethod,
CallIntMethodV,
CallIntMethodA,
CallLongMethod,
CallLongMethodV,
CallLongMethodA,
CallFloatMethod,
CallFloatMethodV,
CallFloatMethodA,
CallDoubleMethod,
CallDoubleMethodV,
CallDoubleMethodA,
CallVoidMethod,
CallVoidMethodV,
CallVoidMethodA,
CallNonvirtualObjectMethod,
CallNonvirtualObjectMethodV,
CallNonvirtualObjectMethodA,
CallNonvirtualBooleanMethod,
CallNonvirtualBooleanMethodV,
CallNonvirtualBooleanMethodA,
CallNonvirtualByteMethod,
CallNonvirtualByteMethodV,
CallNonvirtualByteMethodA,
CallNonvirtualCharMethod,
CallNonvirtualCharMethodV,
CallNonvirtualCharMethodA,
CallNonvirtualShortMethod,
CallNonvirtualShortMethodV,
CallNonvirtualShortMethodA,
CallNonvirtualIntMethod,
CallNonvirtualIntMethodV,
CallNonvirtualIntMethodA,
CallNonvirtualLongMethod,
CallNonvirtualLongMethodV,
CallNonvirtualLongMethodA,
CallNonvirtualFloatMethod,
CallNonvirtualFloatMethodV,
CallNonvirtualFloatMethodA,
CallNonvirtualDoubleMethod,
CallNonvirtualDoubleMethodV,
CallNonvirtualDoubleMethodA,
CallNonvirtualVoidMethod,
CallNonvirtualVoidMethodV,
CallNonvirtualVoidMethodA,
GetFieldID,
GetObjectField,
GetBooleanField,
GetByteField,
GetCharField,
GetShortField,
GetIntField,
GetLongField,
GetFloatField,
GetDoubleField,
SetObjectField,
SetBooleanField,
SetByteField,
SetCharField,
SetShortField,
SetIntField,
SetLongField,
SetFloatField,
SetDoubleField,
GetStaticMethodID,
CallStaticObjectMethod,
CallStaticObjectMethodV,
CallStaticObjectMethodA,
CallStaticBooleanMethod,
CallStaticBooleanMethodV,
CallStaticBooleanMethodA,
CallStaticByteMethod,
CallStaticByteMethodV,
CallStaticByteMethodA,
CallStaticCharMethod,
CallStaticCharMethodV,
CallStaticCharMethodA,
CallStaticShortMethod,
CallStaticShortMethodV,
CallStaticShortMethodA,
CallStaticIntMethod,
CallStaticIntMethodV,
CallStaticIntMethodA,
CallStaticLongMethod,
CallStaticLongMethodV,
CallStaticLongMethodA,
CallStaticFloatMethod,
CallStaticFloatMethodV,
CallStaticFloatMethodA,
CallStaticDoubleMethod,
CallStaticDoubleMethodV,
CallStaticDoubleMethodA,
CallStaticVoidMethod,
CallStaticVoidMethodV,
CallStaticVoidMethodA,
GetStaticFieldID,
GetStaticObjectField,
GetStaticBooleanField,
GetStaticByteField,
GetStaticCharField,
GetStaticShortField,
GetStaticIntField,
GetStaticLongField,
GetStaticFloatField,
GetStaticDoubleField,
SetStaticObjectField,
SetStaticBooleanField,
SetStaticByteField,
SetStaticCharField,
SetStaticShortField,
SetStaticIntField,
SetStaticLongField,
SetStaticFloatField,
SetStaticDoubleField,
NewString,
GetStringLength,
GetStringChars,
ReleaseStringChars,
NewStringUTF,
GetStringUTFLength,
GetStringUTFChars,
ReleaseStringUTFChars,
GetArrayLength,
NewObjectArray,
GetObjectArrayElement,
SetObjectArrayElement,
NewBooleanArray,
NewByteArray,
NewCharArray,
NewShortArray,
NewIntArray,
NewLongArray,
NewFloatArray,
NewDoubleArray,
GetBooleanArrayElements,
GetByteArrayElements,
GetCharArrayElements,
GetShortArrayElements,
GetIntArrayElements,
GetLongArrayElements,
GetFloatArrayElements,
GetDoubleArrayElements,
ReleaseBooleanArrayElements,
ReleaseByteArrayElements,
ReleaseCharArrayElements,
ReleaseShortArrayElements,
ReleaseIntArrayElements,
ReleaseLongArrayElements,
ReleaseFloatArrayElements,
ReleaseDoubleArrayElements,
GetBooleanArrayRegion,
GetByteArrayRegion,
GetCharArrayRegion,
GetShortArrayRegion,
GetIntArrayRegion,
GetLongArrayRegion,
GetFloatArrayRegion,
GetDoubleArrayRegion,
SetBooleanArrayRegion,
SetByteArrayRegion,
SetCharArrayRegion,
SetShortArrayRegion,
SetIntArrayRegion,
SetLongArrayRegion,
SetFloatArrayRegion,
SetDoubleArrayRegion,
RegisterNatives,
UnregisterNatives,
MonitorEnter,
MonitorExit,
GetJavaVM,
GetStringRegion,
GetStringUTFRegion,
GetPrimitiveArrayCritical,
ReleasePrimitiveArrayCritical,
GetStringCritical,
ReleaseStringCritical,
NewWeakGlobalRef,
DeleteWeakGlobalRef,
ExceptionCheck,
NewDirectByteBuffer,
GetDirectBufferAddress,
GetDirectBufferCapacity
};
jint GetVersion(JNIEnv *env);
ネイティブメソッドインタフェースのバージョンを返します。
JNIEnv インタフェース関数テーブルのインデックス 4
env
: JNI インタフェースポインタ
メジャーバージョン番号を高位の 16 ビットで、マイナーバージョン番号を下位の 16 ビットで返します。
JDK/JRE 1.1 では、GetVersion()
が 0x00010001
を返します。
JDK/JRE 1.2 では、GetVersion()
が 0x00010002
を返します。
JDK/JRE 1.4 では、GetVersion()
が 0x00010004
を返します。
#define JNI_VERSION_1_1 0x00010001
#define JNI_VERSION_1_2 0x00010002
/* Error codes */
#define JNI_EDETACHED (-2) /* thread detached from the VM */
#define JNI_EVERSION (-3) /* JNI version error
#define JNI_VERSION_1_4 0x00010004
jclass DefineClass(JNIEnv *env,
const char *name, jobject loader,
const jbyte *buf, jsize bufLen);
raw クラスデータのバッファからクラスをロードします。raw クラスデータを含むバッファは、DefineClass 呼び出しから返された後に VM で参照されないため、必要に応じて破棄できます。
JNIEnv インタフェース関数テーブルのインデックス 5
env
: JNI インタフェースポインタ
name
: 定義されるクラスまたはインタフェースの名前。文字列は変更後の UTF-8
に符号化されます。
loader
:
定義されたクラスに割り当てられるクラスローダ
buf
: .class
ファイルデータを含むバッファ
bufLen
: バッファ長
クラスオブジェクトを返します。エラーが発生した場合は null
を返します。
ClassFormatError
:
クラスデータが有効なクラスを指定しなかった場合
ClassCircularityError
:
クラスまたはインタフェースが、それ自体のスーパークラスまたはスーパーインタフェースになる場合
OutOfMemoryError
:
システムがメモリ不足の場合
jclass FindClass(JNIEnv *env,
const char *name);
この関数は、局所的に定義されたクラスをロードします。また、指定された名前を持つクラスに対して CLASSPATH
環境変数が指定するディレクトリおよび ZIP ファイルを検索します。
JNIEnv インタフェース関数テーブルのインデックス 6
env
: JNI インタフェースポインタ
name
: 完全修飾クラス名 (「/
」で区切ったあとにクラス名を付けたパッケージ名)。その名前が「[
」(配列シグニチャー文字) で開始されている場合は、配列クラスを返します。文字列は変更後の
UTF-8 に符号化されます。
完全修飾名からクラスオブジェクトを返します。クラスが見つからない場合は、null
を返します。
ClassFormatError
:
クラスデータが有効なクラスを指定しなかった場合
ClassCircularityError
:
クラスまたはインタフェースが、それ自体のスーパークラスまたはスーパーインタフェースになる場合
NoClassDefFoundError
:
要求されたクラスまたはインタフェースに対する定義が見つからなかった場合
OutOfMemoryError
:
システムがメモリ不足の場合
JDK 1.1 では、FindClass
は CLASSPATH
内のローカルクラスだけを検索しました。検索されたクラスは、クラスローダを持っていませんでした。
Java
セキュリティモデルは拡張され、システムクラス以外のクラスによるネイティブメソッドのロードおよび呼び出しが可能になりました。Java 2
プラットフォームでは、FindClass
が、現在のネイティブメソッドと関連付けられているクラスローダを検出します。ネイティブコードがシステムクラスに属する場合、クラスローダは検出されま
せん。それ以外の場合には、適切なクラスローダが呼び出され、名前が付けられたクラスのロードおよびリンクを行います。
FindClass
が呼び出しインタフェースによって呼び出された場合、現在のネイティブメソッドまたはそれに関連付けられたクラスローダは存在しません。この場合、ClassLoader.getBaseClassLoader
の結果が使用されます。これは、仮想マシンがアプリケーション用に作成するクラスローダです。java.class.path
プロパティにリストされたクラスを検索できます。
jclass GetSuperclass(JNIEnv *env,
jclass clazz);
clazz
がクラス Object
以外のクラスを表す場合、この関数は、clazz
によって指定されたクラスのスーパークラスを表すオブジェクトを返します。
clazz
がクラス Object
を指定する場合、または、clazz
がインタフェースを表す場合は、この関数は null
を返します。
JNIEnv インタフェース関数テーブルのインデックス 10
env
: JNI インタフェースポインタ
clazz
: Java クラスオブジェクト
clazz
によって表されるクラスのスーパークラスまたは null
を返します。
jboolean IsAssignableFrom(JNIEnv
*env, jclass clazz1,
jclass clazz2);
clazz1
のオブジェクトが安全に clazz2
へキャストされるかどうかを決定します。
JNIEnv インタフェース関数テーブルのインデックス 11
env
: JNI インタフェースポインタ
clazz1
: 最初のクラス引数
clazz2
: 2 番目のクラス引数
次のいずれかが真の場合に JNI_TRUE
を返します。
jint Throw(JNIEnv *env, jthrowable
obj);
java.lang.Throwable
オブジェクトがスローされます。
JNIEnv インタフェース関数テーブルのインデックス 13
env
: JNI インタフェースポインタ
obj
: java.lang.Throwable
オブジェクト
成功の場合は「0」を返し、失敗の場合は負の値を返します。
java.lang.Throwable
object
obj
jint ThrowNew(JNIEnv *env, jclass
clazz,
const char *message);
message
によって指定されたメッセージを使用して、指定されたクラスから例外オブジェクトを構築し、その例外がスローされるようにします。
JNIEnv インタフェース関数テーブルのインデックス 14
env
: JNI インタフェースポインタ
clazz
: java.lang.Throwable
のサブクラス
message
: java.lang.Throwable
オブジェクトの構築に使用するメッセージ文字列は変更後の
UTF-8 に符号化されます。
成功の場合は「0」を返し、失敗の場合は負の値を返します。
新しく構築された
java.lang.Throwable
オ
ブジェクト
jthrowable
ExceptionOccurred(JNIEnv *env);
例外がスローされるかどうかを決定します。例外は、ネイティブコードが ExceptionClear()
を呼び出すか、または Java コードがその例外を処理するまでスローされた状態を続けます。
JNIEnv インタフェース関数テーブルのインデックス 15
env
: JNI インタフェースポインタ
現在スローされている例外オブジェクトを返します。現在、スローされている例外がない場合は、null
を返します。
void ExceptionDescribe(JNIEnv
*env);
stderr
など、例外およびスタックのバックトレースをシステムエラーのレポーティングチャネルにプリントします。これは、デバッグのために提供されている便利な
ルーチンです。
JNIEnv インタフェース関数テーブルのインデックス 16
env
: JNI インタフェースポインタ
void ExceptionClear(JNIEnv *env);
現在スローされている例外があればそれをクリアします。現在スローされている例外がない場合は、このルーチンは影響を 及ぼしません。
JNIEnv インタフェース関数テーブルのインデックス 17
env
: JNI インタフェースポインタ
void FatalError(JNIEnv *env, const
char *msg);
致命的エラーを発生させます。VM による回復は期待されません。この関数は値を返しません。
JNIEnv インタフェース関数テーブルのインデックス 18
env
: JNI インタフェースポインタ
msg
: エラーメッセージ文字列は変更後の UTF-8
に符号化されます。
jboolean ExceptionCheck(JNIEnv
*env);
未処理の例外がある場合は
JNI_TRUE
を、ない場合はJNI_FALSE
を返します。
SDK/JRE 1.2
jobject NewGlobalRef(JNIEnv *env,
jobject obj);
obj
引数によって参照されたオブジェクトの新しいグローバル参照を作成します。obj
引数は、グローバル参照またはローカル参照のどちらでも構いません。グローバル参照は、DeleteGlobalRef()
を呼び出すことによって、必ず明示的に処理しておく必要があります。
JNIEnv インタフェース関数テーブルのインデックス 21
env
: JNI インタフェースポインタ
obj
: グローバル参照またはローカル参照
グローバル参照を返します。システムがメモリ不足の場合は null
を返します。
void DeleteGlobalRef(JNIEnv *env,
jobject globalRef);
globalRef
によって示されたグローバル参照を削除します。
JNIEnv インタフェース関数テーブルのインデックス 22
env
: JNI インタフェースポインタ
globalRef
: グローバル参照
ローカル参照は、ネイティブメソッドの呼び出し期間中有効です。ローカル参照は、ネイティブメソッドが復帰すると自動的に解放されます。各ローカル 参照は、Java 仮想マシンのリソースをいくらか消費します。プログラマは、ネイティブメソッドがローカル参照を過剰に割り当てないように確認する必要があります。ローカ ル参照は、ネイティブメソッドが Java に復帰すると自動的に解放されますが、ローカル参照を過剰に割り当てると、ネイティブメソッドの実行中に VM がメモリを使い果たしてしまう可能性があります。
void DeleteLocalRef(JNIEnv *env,
jobject localRef);
localRef
によって示されたローカル参照を削除します。
JNIEnv インタフェース関数テーブルのインデックス 23
env
: JNI インタフェースポインタ
localRef
: ローカル参照
注:JDK/JRE 1.1 は、上記の JDK/JRE 1.2 以降では、ローカル参照の有効期間の管理用に関数のセットが追加されました。追加された 4 つの関数は以下のとおりです。 |
jint
EnsureLocalCapacity(JNIEnv *env, jint capacity);
現在のスレッドで最低限指定された数のローカル参照を作成できることを保証します。関数が正常に実行された場合には、0
が返されます。それ以外の場合には、負の数が返され OutOfMemoryError
がスローされます。
ネイティブメソッドに入る前に、VM は自動的に最低 16 のローカル参照の作成を保証します。
下位互換性のために VM は、保証された容量以上にローカル参照を割り当てます(デバッグのサポートとして、VM
がユーザに対し、ローカル参照の作成数が多すぎるという内容の警告を発する場合がある。JDK では、プログラマは -verbose:jni
コマンド行オプションを供給し、これらのメッセージを有効にすることができる)。保証された容量を超えてしまい、これ以上ローカル参照を作成できない場
合、VM は、FatalError
を呼び出します。
SDK/JRE 1.2
jint PushLocalFrame(JNIEnv
*env, jint capacity);
新しいローカル参照フレームを作成します。このフレームに最低限指定された数のローカル参照を作成できます。正常に実行された場合には、0
が返されます。失敗した場合には、負の数が返され、OutOfMemoryError
がスローされます。
前回のローカルフレームで作成済みのローカル参照は、現在のローカルフレームでも依然として有効です。
JDK/JRE 1.2
jobject PopLocalFrame(JNIEnv
*env, jobject result);
現在のローカル参照フレームを無効にし、すべてのローカル参照を解放します。そして指定された result
オブジェクトに対する前回のローカル参照フレームのローカル参照を返します。
前回のフレームに参照を返す必要のない場合には、result
として null
を渡します。
JDK/JRE 1.2
jobject NewLocalRef(JNIEnv *env,
jobject ref);
ref
と同じオブジェクトを参照する新しいローカル参照を作成します。渡された ref
は、グローバル参照またはローカル参照である可能性があります。ref
が null
を参照している場合には、null
が返されます。
JDK/JRE 1.2
null
と同等です。プログラマは、IsSameObject
を使用して弱参照と null
とを比較することにより、弱グローバル参照が解放されたオブジェクトを参照しているかどうか確認できます。
JNI の弱グローバル参照は、Java 2 プラットフォーム API (java.lang.ref
およびそのクラス) の一部として入手可能な Java 弱参照の簡易版です。
解説 (2001年6月に追加)
ガベージコレクションはネイティブメソッドの実行中に発生するため、弱グローバル参照で参照されているオブジェクトはいつでも解放できます。弱 グローバル 参照は、グローバル参照が使用されているところならどこでも使用できますが、そのように使用すると予告なしで
null
と機能的に同等になる場合があるので、一般的には不適切です。
IsSameObject
は弱グローバル参照が解放されたオブジェクトを参照しているかどうかを判別するのに使用できますが、オブジェクトがその直後に解放されるのを防止するわけ ではありません。そのため、プログラマはこの検査に基づいて、その後の JNI 呼び出しで弱グローバル参照が (null
参 照以外で) 使用されているかどうかを判別することはできません。この継承制限を解消するため、JNI 関数
NewLocalRef
またはNewGlobalRef
を使用して同一のオブジェクトへの標準 (強い) ローカル参照またはグローバル参照を取得し、この強い参照を使用して該当するオブジェクトにアクセスすることをお勧めします。オブジェクトが解放されてい る場合、この関数はnull
を返します。その他の場合、強い参照を返します (強い参照はオブジェクトが解放されるのを防止する)。オブジェクトへの直接アクセスが不要になったときは、オブジェクトを解放できるように、新しい参照 を明示的に削除する必要があります。弱グローバル参照は、他の種類の弱い参照 (SoftReference クラスまたは WeakReference クラスの Java オブジェクト) よりも弱い参照です。特定のオブジェクトへの弱いグローバル参照は、そのオブジェクトを参照する SoftReference オブジェクトまたは WeakReference オブジェクトが参照を解除するまで、機能的に
null
と同等にはなりません。弱グローバル参照は、ファイナライズを必要とするオブジェクトへのJava の内部参照よりも弱い参照です。弱グローバル参照 は、参照先のオブジェクトのファイナライザが存在する場合、それが完了するまで、
null
と機能的に同等にはなりません。弱グローバル参照と PhantomReference との相互動作は未定義です。特に、Java VM の実装は、PhantomReference のあとに弱グローバル参照を処理する場合があり、PhantomReference オブジェクトでも参照されているオブジェクトを保持するために弱グローバル参照を使用することが可能な場合があります。弱グローバル参照をこのような未定 義の方法で使用するのは避けるべきです。
jweak NewWeakGlobalRef(JNIEnv *env, jobject obj);
弱グローバル参照を新規作成します。obj
が null
を参照している場合、または
VM がメモリを使い果たしてしまった場合は、null
が返されます。VM がメモリを使い果たしてしまった場合、OutOfMemoryError
がスローされます。
JDK/JRE 1.2
void DeleteWeakGlobalRef(JNIEnv *env, jweak obj);
渡された弱グローバル参照に必要な VM リソースを削除します。
jobject AllocObject(JNIEnv *env,
jclass clazz);
オブジェクト用としてコンストラクタを呼び出さずに、新しい Java オブジェクトを割り当てます。オブジェクトに対する参照を返します。
clazz 引数は、配列クラスを参照してはなりません。
JNIEnv インタフェース関数テーブルのインデックス 27
env
: JNI インタフェースポインタ
clazz
: Java クラスオブジェクト
Java オブジェクトを返します。Java オブジェクトが構築できなかった場合は、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 メソッドに渡します。
JNIEnv インタフェース関数テーブルのインデックス 28
プログラマは、コンストラクタに渡す引数をすべて、methodID
引数のすぐあとに続く jvalues
の args
配列内に置きます。NewObjectA()
はこの配列内の引数を受け取り、プログラマが呼び出したい Java メソッドに渡します。
JNIEnv インタフェース関数テーブルのインデックス 30
プログラマは、コンストラクタに渡す引数をすべて、methodID
引数のすぐあとに続く型 va_list
の args
引数内に置きます。NewObjectV()
はこれらの引数を受け取り、プログラマが呼び出したい Java メソッドに渡します。
JNIEnv インタフェース関数テーブルのインデックス 29
env
: JNI インタフェースポインタ
clazz
: Java クラスオブジェクト
methodID
: コンストラクタのメソッド ID
コンストラクタの引数
args
: コンストラクタの引数の配列
args
: コンストラクタの引数の va_list
Java オブジェクトを返します。Java オブジェクトが構築できなかった場合は、null
を返します。
InstantiationException
:
クラスがインタフェースまたは abstract クラスの場合
OutOfMemoryError
:
システムがメモリ不足の場合
コンストラクタによってスローされるすべての例外
jclass GetObjectClass(JNIEnv *env,
jobject obj);
オブジェクトのクラスを返します。
JNIEnv インタフェース関数テーブルのインデックス 31
env
: JNI インタフェースポインタ
obj
: Java オブジェクト (null
であってはならない)
Java クラスオブジェクトを返します。
jboolean IsInstanceOf(JNIEnv *env,
jobject obj,
jclass clazz);
オブジェクトがクラスのインスタンスであるかどうかをチェックします。
JNIEnv インタフェース関数テーブルのインデックス 32
env
: JNI インタフェースポインタ
obj
: Java オブジェクト
clazz
: Java クラスオブジェクト
obj
を clazz
にキャストすることができる場合は、JNI_TRUE
を返します。そうでない場合は、JNI_FALSE
を返します。null
オブジェクトは、どのクラスにもキャストすることができます。
jboolean IsSameObject(JNIEnv *env,
jobject ref1,
jobject ref2);
2 つの参照が同じ Java オブジェクトを参照するかどうかをテストします。
JNIEnv インタフェース関数テーブルのインデックス 24
env
: JNI インタフェースポインタ
ref1
: Java オブジェクト
ref2
: Java オブジェクト
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()
を使用してください。
JNIEnv インタフェース関数テーブルのインデックス 94
env
: JNI インタフェースポインタ
clazz
: Java クラスオブジェクト
name
: 0 で終了する変更後の UTF-8
文字列内のフィールド名
sig
: 0 で終了する変更後の UTF-8
文字列内のフィールドシグニチャー
フィールド ID を返します。 演算が失敗した場合は null
を返します。
NoSuchFieldError
:
指定されたフィールドが見つからない場合
ExceptionInInitializerError
:
例外のため、クラス初期化が失敗した場合
OutOfMemoryError
:
システムがメモリ不足の場合
NativeType
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
であってはならない)
fieldID
: 有効フィールド ID
フィールドの内容を返します。
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 をそのルーチンに対応するネイティブ型と置き換える必要があります。
JNIEnv インタフェース関数テーブルのインデックス
env
: JNI インタフェースポインタ
obj
: Java オブジェクト (null
であってはならない)
fieldID
: 有効フィールド ID
value
: そのフィールドの新しい値
jmethodID GetMethodID(JNIEnv *env,
jclass clazz,
const char *name, const char *sig);
クラスまたはインタフェースのインスタンス (非 static) メソッドを表すメソッド ID
を返します。このメソッドは、clazz
のスーパークラスの 1 つの中で定義し、clazz
によって継承できます。このメソッドは、その名前およびシグニチャーによって決定されます。
GetMethodID()
によって、まだ初期化されていないクラスが初期化されます。
コンストラクタのメソッド ID を取得するには、メソッド名として <init>
を指定し、戻り値の型として void
(V
)
を指定します。
JNIEnv インタフェース関数テーブルのインデックス 33
env
: JNI インタフェースポインタ
clazz
: Java クラスオブジェクト
name
: 0 で終了する変更後の UTF-8
文字列内のメソッド名
sig
: 0 で終了する変更後の UTF-8
文字列内のメソッドシグニチャー
メソッド ID を返します。指定されたメソッドが見つからなかった場合は、null
を返します。
NoSuchMethodError
:
指定されたメソッドが見つからない場合
ExceptionInInitializerError
:
例外のため、クラス初期化が失敗した場合
OutOfMemoryError
:
システムがメモリ不足の場合
NativeType
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 をそのルーチンに対応するネイティブ型と置き換える必要があります。
JNIEnv インタフェース関数テーブルのインデックス
env
: JNI インタフェースポインタ
obj
: Java オブジェクト
methodID
: メソッド ID
メソッドに対する引数
args
: 引数の配列
args
: 引数の va_list
Java メソッドを呼び出した結果を返します。
Java メソッドを実行している間に発生した例外
NativeType
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 をそのルーチンに対応するネイティブ型と置き換える必要があります。
JNIEnv インタフェース関数テーブルのインデックス
env
: JNI インタフェースポインタ
clazz
: Java クラス
obj
: Java オブジェクト
methodID
: メソッド ID
メソッドに対する引数
args
: 引数の配列
args
: 引数の va_list
Java メソッドを呼び出した結果を返します。
Java メソッドを実行している間に発生した例外
jfieldID GetStaticFieldID(JNIEnv
*env, jclass clazz,
const char *name, const char *sig);
クラスの static フィールドを表すフィールド ID を返します。このフィールドは、その名前とシグニチャーで指定します。アクセス用関数の GetStatic<type>Field ファミリと SetStatic<type>Field ファミリは、フィールド ID を使用して static フィールドを取り出します。
GetStaticFieldID()
によって、まだ初期化されていないクラスが初期化されます。
JNIEnv インタフェース関数テーブルのインデックス 144
env
: JNI インタフェースポインタ
clazz
: Java クラスオブジェクト
name
: 0 で終了する変更後の UTF-8
文字列内の static フィールド
sig
: 0 で終了する変更後の UTF-8
文字列内のフィールドシグニチャー
フィールド ID を返します。 指定された static フィールドが見つからなかった場合は、null
を返します。
NoSuchFieldError
: 指定された
static フィールドが見つからない場合
ExceptionInInitializerError
:
例外のため、クラス初期化が失敗した場合
OutOfMemoryError
:
システムがメモリ不足の場合
NativeType
GetStatic<type>Field(JNIEnv *env, jclass clazz,
jfieldID fieldID);
このアクセス用ルーチンのファミリは、オブジェクトの static
フィールドを返します。アクセスするフィールドは、フィールド ID で指定します。 フィールド ID は、GetStaticFieldID()
を呼び出すことによって取得することができます。
次の表には、 get ルーチン名のファミリと結果の型が示されています。GetStatic<type>Field 内の type をフィールドの Java 型と置き換えるか、あるいは表の実際の static フィールドアクセス用ルーチン名の 1 つを使用して、NativeType をそのルーチンに対応するネイティブ型と置き換える必要があります。
JNIEnv インタフェース関数テーブルのインデックス
env
: JNI インタフェースポインタ
clazz
: Java クラスオブジェクト
fieldID
: static フィールド ID
static フィールドの内容を返します。
void
SetStatic<type>Field(JNIEnv *env, jclass clazz,
NativeType
jfieldID fieldID, value);
このアクセス用ルーチンのファミリは、オブジェクトの static
フィールドの値を設定します。アクセスするフィールドは、フィールド ID で指定します。 フィールド ID は、GetStaticFieldID()
を呼び出すことによって取得することができます。
次の表には、セットルーチン名と値の型が示されています。SetStatic<type>Field 内の type をフィールドの Java 型と置き換えるか、あるいは表の実際のセット static フィールドルーチン名の 1 つを使用して、NativeType をそのルーチンに対応するネイティブ型と置き換える必要があります。
JNIEnv インタフェース関数テーブルのインデックス
env
: JNI インタフェースポインタ
clazz
: Java クラスオブジェクト
fieldID
: static フィールド ID
value
: そのフィールドの新しい値
jmethodID GetStaticMethodID(JNIEnv
*env, jclass clazz,
const char *name, const char *sig);
クラスの static メソッドを表すメソッド ID を返します。このメソッドは、その名前とシグニチャーで指定します。
GetStaticMethodID()
によって、まだ初期化されていないクラスが初期化されます。
env
: JNI インタフェースポインタ
clazz
: Java クラスオブジェクト
name
: 0 で終了する変更後の UTF-8
文字列内の static メソッド名
sig
: 0 で終了する変更後の UTF-8
文字列内のメソッドシグニチャー
メソッド ID を返します。演算が失敗した場合は null
を返します。
NoSuchMethodError
: 指定された
static メソッドが見つからない場合
ExceptionInInitializerError
:
例外のため、クラス初期化が失敗した場合
OutOfMemoryError
:
システムがメモリ不足の場合
NativeType
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 をそのルーチンに対応するネイティブ型と置き換える必要があります。
JNIEnv インタフェース関数テーブルのインデックス
env
: JNI インタフェースポインタ
clazz
: Java クラスオブジェクト
methodID
: static メソッド ID
static メソッドの引数
args
: 引数の配列
args
: 引数の va_list
static Java メソッドを呼び出した結果を返します。
Java メソッドを実行している間に発生した例外
jstring NewString(JNIEnv *env,
const jchar *unicodeChars,
jsize len);
Unicode 文字配列から新しい java.lang.String
オブジェクトを構築します。
env
: JNI インタフェースポインタ
unicodeChars
: Unicode
文字列を参照するポインタ
len
: Unicode 文字列の長さ
Java 文字列オブジェクトを返します。 文字列が構築できない場合は null
を返します。
OutOfMemoryError
:
システムがメモリ不足の場合
jsize GetStringLength(JNIEnv *env,
jstring string);
Java 文字列の長さ (Unicode 文字のカウント) を返します。
env
: JNI インタフェースポインタ
string
: Java 文字列オブジェクト
Java 文字列の長さを返します。
const jchar *
GetStringChars(JNIEnv *env, jstring string,
jboolean *isCopy);
文字列の Unicode 文字の配列を参照するポインタを返します。このポインタは、ReleaseStringchars()
が呼び出されるまで有効です。
isCopy
が null
ではない場合にコピーが作成されると、*isCopy
は JNI_TRUE
に設定されます。コピーが作成されない場合は、JNI_FALSE
に設定されます。
env
: JNI インタフェースポインタ
string
: Java 文字列オブジェクト
isCopy
: ブール値に対するポインタ
Unicode 文字列を参照するポインタを返します。演算が失敗した場合は null
を返します。
void ReleaseStringChars(JNIEnv
*env, jstring string,
const jchar *chars);
ネイティブコードが chars
へのアクセスをもはや必要としていないことを VM に知らせます。chars
引数は、GetStringChars()
を使用してstring
から取得することができるポインタです。
env
: JNI インタフェースポインタ
string
: Java 文字列オブジェクト
chars
: Unicode 文字列を参照するポインタ
jstring NewStringUTF(JNIEnv *env,
const char *bytes);
変更後の UTF-8 文字の配列から新しい java.lang.String
オブジェクトを構築します。
env
: JNI インタフェースポインタ
bytes
: 変更後の UTF-8
文字列を参照するポインタ
Java 文字列オブジェクトを返します。 文字列が構築できない場合は null
を返します。
OutOfMemoryError
:
システムがメモリ不足の場合
jsize GetStringUTFLength(JNIEnv
*env, jstring string);
変更後の UTF-8 で表現した文字列の長さをバイトで返します。
env
: JNI インタフェースポインタ
string
: Java 文字列オブジェクト
文字列の UTF-8 長を返します。
const jbyte*
GetStringUTFChars(JNIEnv *env, jstring string,
jboolean *isCopy);
変更後の UTF-8 で文字列を表すバイト配列を参照するポインタを返します。この配列は、ReleaseStringUTFChars()
によって解放されるまで有効です。
isCopy
が null
ではない場合にコピーが作成されると、*isCopy
は JNI_TRUE
に設定されます。コピーが作成されない場合は、JNI_FALSE
に設定されます。
env
: JNI インタフェースポインタ
string
: Java 文字列オブジェクト
isCopy
: ブール値に対するポインタ
変更後の UTF-8 文字列を参照するポインタを返します。演算が失敗した場合は null
を返します。
void ReleaseStringUTFChars(JNIEnv
*env, jstring string,
const char *utf);
ネイティブコードが utf
へのアクセスをもはや必要としていないことを VM に知らせます。utf
引数は、GetStringUTFChars()
を使用して string
から取得することができるポインタです。
env
: JNI インタフェースポインタ
string
: Java 文字列オブジェクト
utf
: 変更後の UTF-8
文字列を参照するポインタ
注:SKD/JRE 1.1 では、プログラマはユーザが提供するバッファのプリミティブ配列要素を取得できました。JDK/JRE 1.2 以降のバージョンでは、ネイティブコードを使用して、ユーザが提供するバッファの Unicode (UTF-16) または変更後の UTF-8 エンコーディングされた文字を取得することができます。以下の関数を参照してください。 |
void GetStringRegion(JNIEnv *env, jstring str, jsize start,
jsize len, jchar *buf);
オフセット start
で始まる len
個の Unicode
文字を、与えられたバッファ buf
にコピーします。
StringIndexOutOfBoundsException
をインデックスオーバーフロー時にスローします。
JDK/JRE 1.2
< void GetStringUTFRegion(JNIEnv *env, jstring str, jsize
start, jsize len, char *buf);
オフセット start
で始まる len
個の Unicode 文字を変更後の
UTF-8 エンコーディングに変換し、その結果を与えられたバッファ buf
に置きます。
StringIndexOutOfBoundsException
をインデックスオーバーフロー時にスローします。
JDK/JRE 1.2
ReleaseStringCriticalconst jchar * GetStringCritical(JNIEnv *env, jstring string,
jboolean *isCopy);
void ReleaseStringCritical(JNIEnv *env, jstring string, const jchar
*carray);
上の 2 つの関数のセマンティクスは、既存の Get/ReleaseStringChars
関数に似ています。可能な場合には、VM は文字列要素へのポインタを返します。そうでない場合、コピーが作成されます。ただし、これら
の関数の使用方法に関して重要な制限があります。Get/ReleaseStringCritical
の呼び出しによって囲まれるコードセグメントにおいて、ネイティブコードは任意の JNI
呼び出しを行なったり、現在のスレッドにブロックさせてはなりません。
Get/ReleaseStringCritical
の制限は、Get/ReleasePrimitiveArrayCritical
の制限と類似しています。
JDK/JRE 1.2
jsize GetArrayLength(JNIEnv *env,
jarray array);
配列内の要素の数を返します。
env
: JNI インタフェースポインタ
array
: Java 配列オブジェクト
配列の長さを返します。
jobjectArray NewObjectArray(JNIEnv
*env, jsize length,
jclass elementClass, jobject initialElement);
クラス elementClass
にオブジェクトを持つ新しい配列を構築します。要素はすべて、最初に initialElement
に設定されます。
env
: JNI インタフェースポインタ
length
: 配列サイズ
elementClass
: 配列要素クラス
initialElement
: 初期化値
Java 配列オブジェクトを返します。 Java 配列が構築できなかった場合は null
を返します。
OutOfMemoryError
:
システムがメモリ不足の場合
jobject
GetObjectArrayElement(JNIEnv *env,
jobjectArray array, jsize index);
Object
配列の要素を返します。
env
: JNI インタフェースポインタ
array
: Java 配列
index
: 配列添字
Java オブジェクトを返します。
ArrayIndexOutOfBoundsException
:
index
が配列内に有効な添字の値を指定しなかった場合
void SetObjectArrayElement(JNIEnv
*env, jobjectArray array,
jsize index, jobject value);
Object
配列の要素を設定します。
env
: JNI インタフェースポインタ
array
: Java 配列
index
: 配列添字
value
: 新しい値
ArrayIndexOutOfBoundsException
:
index
が配列内に有効な添字の値を指定しなかった場合
ArrayStoreException
: value
のクラスが、配列の要素クラスのサブクラスではない場合
ArrayType
New<PrimitiveType>Array(JNIEnv *env, jsize length);
新しいプリミティブ配列オブジェクトを構築するために使用される演算のファミリ。表 4-8 には、特定のプリミティブ配列コンストラクタが示されています。New<PrimitiveType>Array を、次の表の実際のプリミティブ配列コンストラクタルーチン名の 1 つと置き換え、ArrayType をそのルーチンに対応する配列型と置き換える必要があります。
JNIEnv インタフェース関数テーブルのインデックス
env
: JNI インタフェースポインタ
length
: 配列長
Java 配列を返します。Java 配列が構築できなかった場合は null
を返します。
NativeType *
Get<PrimitiveType>ArrayElements(JNIEnv *env,
ArrayType
array, jboolean *isCopy);
プリミティブ配列の本体を返す関数のファミリです。その結果は、対応する Release<
PrimitiveType>
ArrayElements() 関数が呼び出されるまで有効です。返された配列は Java
配列のコピーである場合もあるため、その返された配列に加えられている変更は、Release<PrimitiveType>ArrayElements()
が呼び出されるまでは、必ずしも元の array
に反映されているとは限りません。
isCopy
が null
ではない場合にコピーが作成されると、*isCopy
は JNI_TRUE
に設定されます。コピーが作成されない場合は、JNI_FALSE
に設定されます。
次の表には、特定のプリミティブ配列要素アクセス機能が示されています。次の置換を行う必要があります。
Java VM 内でブール配列がどのように表されているかにかかわらず、GetBooleanArrayElements()
は常に jbooleans
を参照するポインタを返してきます。 各バイトが 1
つの要素を表しています (アンパック表示)。その他の型の配列はすべて、メモリ内で必ず隣接するようになっています。
JNIEnv インタフェース関数テーブルのインデックス
env
: JNI インタフェースポインタ
array
: Java 文字列オブジェクト
isCopy
: ブール値に対するポインタ
配列要素を参照するポインタを返します。演算が失敗した場合は、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
内の要素のコピーである場合は、次の表に示されているような影響を及ぼします。
mode
|
動作
|
---|---|
0 |
内容をコピーバックし、
elems
バッファを解放する |
JNI_COMMIT |
内容をコピーバックするが、
elems
バッファを解放しない |
JNI_ABORT |
変更の可能性があってもその変更をコピーバックせずに、バッファを解放する
|
多くの場合、プログラマは、ピン配列とコピー配列の両方に対して一貫した動作を保証するために、「0�を mode
引数に渡します。0
以外を渡す場合は、プログラマはメモリを十分に注意して管理する必要があります。
次の表には、プリミティブ配列処置機能のファミリを構成する特定のルーチンが示されています。次の置換を行う必要があ ります。
JNIEnv インタフェース関数テーブルのインデックス
env
: JNI インタフェースポインタ
array
: Java 配列オブジェクト
elems
: 配列要素を参照するポインタ
mode
: 解放モード
void
Get<PrimitiveType>ArrayRegion(JNIEnv *env,
ArrayType array,
NativeType
jsize start, jsize len, *buf);
プリミティブ配列の領域をバッファにコピーする機能のファミリです。
次の表には、特定のプリミティブ配列要素アクセス機能が示されています。次の置換を行う必要があります。
JNIEnv インタフェース関数テーブルのインデックス
env
: JNI インタフェースポインタ
array
: Java 配列
start
: 開始添字
len
: コピー対象の要素の数
buf
: 転送先バッファ
ArrayIndexOutOfBoundsException
:
領域内の添字の 1 つでも有効ではない場合
void
Set<PrimitiveType>ArrayRegion(JNIEnv *env,
ArrayType array,
NativeType
jsize start, jsize len, *buf);
バッファからのプリミティブ配列の領域をコピーバックする機能のファミリです。
次の表には、特定のプリミティブ配列要素アクセス機能が示されています。次の置換を行う必要があります。
JNIEnv インタフェース関数テーブルのインデックス
env
: JNI インタフェースポインタ
array
: Java 配列
start
: 開始添字
len
: コピー対象の要素の数
buf
: 転送元バッファ
ArrayIndexOutOfBoundsException
:
領域内の添字の 1 つでも有効ではない場合
注:JDK/JRE 1.1 では、プログラマは JDK/JRE 1.3 に導入された新しい関数を使用すると、VM がピニングをサポートしていない場合でも、ネイティブコードは配列要素への直接ポインタを取得することができます。 |
void *
GetPrimitiveArrayCritical(JNIEnv *env, jarray array, jboolean *isCopy);
void
ReleasePrimitiveArrayCritical(JNIEnv *env, jarray array, void *carray,
jint mode);
上の 2 つの関数のセマンティクスは、既存の Get/Release
GetPrimitiveArrayCritical
を呼び出したあと、ReleasePrimitiveArrayCritical
を呼び出す前に、ネイティブコードを特定の期間実行しないようにします。この 1
組の関数内部のコードは「クリティカルリージョン」で実行されているものとして扱う必要があります。クリティカルリージョン内部においてネイティブコード
は、ほかの JNI 関数を呼び出してはならず、現在のスレッドにほかの Java
スレッドをブロックして待機させることを可能にするどのシステムコールも呼び出してはなりません。たとえば、現在のスレッドは、ほかの Java
スレッドが記述したストリーム上の read
を呼び出してはなりません。
これらの制限は、VM
がピニングをサポートしない場合でも、ネイティブコードが配列のコピーされていないバージョンを取得する可能性を高めます。たとえば、
ネイティブ コードが GetPrimitiveArrayCritical
によって取得された配列へのポインタを保持している場合、VM は一時的にガベージコレクションを無効にすることがあります。
GetPrimtiveArrayCritical
および ReleasePrimitiveArrayCritical
の複数の組み合わせは、入れ子にすることができます。次に例を示します。
jint len = (*env)->GetArrayLength(env, arr1);
jbyte *a1 = (*env)->GetPrimitiveArrayCritical(env, arr1, 0);
jbyte *a2 = (*env)->GetPrimitiveArrayCritical(env, arr2, 0);
/* We need to check in case the VM tried to make a copy. */
if (a1 == NULL || a2 == NULL) {
... /* out of memory exception thrown */
}
memcpy(a1, a2, len);
(*env)->ReleasePrimitiveArrayCritical(env, arr2, a2, 0);
(*env)->ReleasePrimitiveArrayCritical(env, arr1, a1, 0);
VM が内部的に異なる形式で配列を表す場合、GetPrimitiveArrayCritical
はまだ配列のコピーを作成する可能性があります。そのため、起こり得るメモリ不足の状況に対応して null
に対する戻り値をチェックする必要があります。
JNIEnv インタフェース関数テーブルのリンケージインデックス 222
JNIEnv インタフェース関数テーブルのリンケージインデックス 223
JDK/JRE 1.2
jint RegisterNatives(JNIEnv *env,
jclass clazz,
const JNINativeMethod *methods, jint nMethods);
clazz
引数によって指定されたクラスでネイティブメソッドを登録します。methods
パラメータは、そのネイティブメソッドの名前、シグニチャー、関数ポインタを含む JNINativeMethod
構造体の配列を指定します。JNINativeMethod 構造体の name
フィールドと signature
フィールドは、変更された UTF-8
文字列を参照するポインタです。nMethods
パラメータは、配列内のネイティブメソッドの数を指定します。JNINativeMethod
構造体は次のように定義されます。
関数ポインタは、形式上、次のシグニチャーを備えている必要があります。
JNIEnv インタフェース関数テーブルのインデックス 215
env
: JNI インタフェースポインタ
clazz
: Java クラスオブジェクト
methods
: クラス内のネイティブメソッド
nMethods
:
そのクラス内のネイティブメソッドの数
成功の場合は「0」を、失敗の場合は負の値を返します。
NoSuchMethodError
:
指定されたメソッドが見つからなかった場合、または、そのメソッドがネイティブではなかった場合
jint UnregisterNatives(JNIEnv
*env, jclass clazz);
あるクラスのネイティブメソッドの登録を抹消します。そのクラスは、そのネイティブメソッド機能にリンクされる前また は再登録される前の状態に戻ります。
この関数は、通常のネイティブコードでは使用するべきではありません。その代わりに、特別なプログラムにネイティブラ イブラリを再ロードしたり再リンクしたりする方法を提供します。
env
: JNI インタフェースポインタ
clazz
: Java クラスオブジェクト
成功の場合は「0」を、失敗の場合は負の値を返します。
jint MonitorEnter(JNIEnv *env,
jobject obj);
obj
によって参照される基底の Java
オブジェクトに関連するモニターに入ります。
Java オブジェクトは、それぞれ、関連するモニターを持っています。現在のスレッドがすでに obj
に関連するモニターを持つ場合は、このスレッドがモニターに入った回数を表すモニター内のカウンタが増加されます。obj
に関連するモニターがどのスレッドにも所有されていない場合は、現在のスレッドがそのモニターの所有者となり、このモニターのエントリカウントを 1
に設定します。別のスレッドがすでに obj
に関連するモニターを所有している場合、現在のスレッドはモニターが解放されるのを待ち、再度、所有権を獲得しようとします。
env
: JNI インタフェースポインタ
obj
: 通常の Java
オブジェクトまたはクラスオブジェクト
成功の場合は「0」を、失敗の場合は負の値を返します。
jint MonitorExit(JNIEnv *env,
jobject obj);
現在のスレッドは、obj
によって参照された基底の
Java
オブジェクトに関連するモニターの所有者でなければなりません。このスレッドは、このモニターに入った回数を表すカウンタを減少させます。カウンタの値が
ゼロになると、現在のスレッドはモニターを解放します。
env
: JNI インタフェースポインタ
obj
: 通常の Java
オブジェクトまたはクラスオブジェクト
成功の場合は「0」を、失敗の場合は負の値を返します。
NIO 関連のエントリポイントにより、ネイティブコードが java.nio
「直接バッファ」にアクセスできます。
直接バッファのコンテンツは、通常のガベージコレクトされたヒープの外側の、ネイティブメモリ内に格納することができます。直接バッファについての詳細
は、「New I/O API」および java.nio.ByteBuffer
クラスの仕様を参照してください。
Java 仮想マシンの各実装ではこれらの関数をサポートする必要がありますが、すべての実装が直接バッファへの JNI のアクセスをサポートする必要はありません。JVM がこのようなアクセスをサポートしない場合は、NewDirectByteBuffer および GetDirectBufferAddress 関数は常に null を返し、GetDirectBufferCapacity 関数は常に -1 を返します。JVM がこのようなアクセスをサポートする場合、各関数は適切な値を返すように実装される必要があります。
jobject NewDirectByteBuffer(JNIEnv* env, void* address, jlong capacity);
メモリアドレス address から始まる capacity バイトまでのメモリブロックを参照して、直接バッファ java.nio.ByteBuffer を割り当てて返します。
この関数を呼び出して、Java レベルのコードに最終的なバイトバッファのオブジェクトを返すネイティブコードは、そのバッファが、読み込みと、適切な場合には書き出しのアクセスが可能 な、有効なメモリ領域を参照する必要があります。Java コードから無効なメモリ位置にアクセスしようとすると、視覚効果のない任意の値を返すか、指定されていない例外が発生します。
JNIEnv インタフェース関数テーブルのインデックス 229
env: JNIEnv のインタフェースポインタ
address: メモリ領域の開始アドレス (null は不可)
capacity: メモリ領域のバイト数で示したサイズ (正の数であること)
新規にインスタンス化された java.nio.ByteBuffer オブジェクトのローカル参照を返します。例外が発生したり、この仮想マシンが、直接バッファへの JNI のアクセスをサポートしていない場合は、null を返します。
OutOfMemoryError: ByteBuffer オブジェクトの割り当てに失敗した場合
JDK/JRE 1.4
void* GetDirectBufferAddress(JNIEnv* env, jobject buf);
指定された直接バッファ java.nio.Buffer に参照されるメモリ領域の開始アドレスをフェッチし、返します。
この関数によって、ネイティブコードは、Java コードがバッファオブジェクトを介してアクセスできるメモリ領域と同じメモリ領域にアクセスできるようになります。
JNIEnv インタフェース関数テーブルのインデックス 230
env: JNIEnv のインタフェースポインタ
buf: 直接バッファ java.nio.Buffer オブジェクト (null
は不可)
バッファに参照されるメモリ領域の開始アドレスを返します。メモリ領域が未定義の場合、指定されたオブジェクトが直接バッファの java.nio.Buffer
オブジェクトでない場合、または、直接バッファへの JNI のアクセスがこの仮想マシンでサポートされていない場合は、null
を返します。
JDK/JRE 1.4
jlong GetDirectBufferCapacity(JNIEnv* env, jobject buf);
指定された直接バッファ java.nio.Buffer に参照されるメモリ領域のバイト数で示したサイズをフェッチし、返します。
JNIEnv インタフェース関数テーブルのインデックス 231
env: JNIEnv のインタフェースポインタ
buf: 直接バッファ java.nio.Buffer オブジェクト (null は不可)
バッファに関連付けられたメモリ領域のサイズをバイト数で返します。指定されたオブジェクトが直接バッファの java.nio.Buffer オブジェクトでない場合、または、直接バッファへの JNI のアクセスがこの仮想マシンでサポートされていない場合は、-1 を返します。
JDK/JRE 1.4
プログラマは、メソッドまたはフィールドの名前および型を把握している場合、JNI を使用して Java メソッドの呼び出しまたは Java フィールドへのアクセスを行うことができます。Java Core Reflection API を使用すると、プログラマは実行時に Java クラスの内部を調査することができます。JNI は、JNI で使用されるフィールドとメソッド ID および Java Core Reflection API で使用されるメソッドオブジェクトの間の変換関数のセットを提供します。
jmethodID
FromReflectedMethod(JNIEnv *env, jobject method);
java.lang.reflect.Method
または java.lang.reflect.Constructor
オブジェクトをメソッド ID に変換します。
JNIEnv インタフェース関数テーブルのインデックス 7
JDK/JRE 1.2
jfieldID
FromReflectedField(JNIEnv *env, jobject field);
java.lang.reflect.Field
をフィールド ID に変換します。
JDK/JRE 1.2
jobject
ToReflectedMethod(JNIEnv *env, jclass cls,
jmethodID methodID);
cls
から取得したメソッド ID を java.lang.reflect.Method
または java.lang.reflect.Constructor
オブジェクトに変換します。
変換に失敗した場合には、OutOfMemoryError
をスローし、0 を返します。
JNIEnv インタフェース関数テーブルのインデックス 9
JDK/JRE 1.2
jobject
ToReflectedField(JNIEnv *env, jclass cls,
jfieldID fieldID);
cls
から取得したフィールド ID を java.lang.reflect.Field
オブジェクトに変換します。
変換に失敗した場合には、OutOfMemoryError
をスローし、0 を返します。
JNIEnv インタフェース関数テーブルのインデックス 12
JDK/JRE 1.2
jint GetJavaVM(JNIEnv *env, JavaVM
**vm);
現在のスレッドに関連する Java VM インタフェース (呼び出し API で使用)
を返します。その結果は、2 番目の引数 vm
で示された位置に置かれます。
JNIEnv インタフェース関数テーブルのインデックス 219
env
: JNI インタフェースポインタ
vm
: 結果を返すポインタ
成功の場合は「0」を、失敗の場合は負の値を返します。
目次 | 前の項目 | 次の項目 | |
Copyright © 2003 Sun Microsystems, Inc. All rights reserved.