JNI考慮事項
64 ビット・システムでネイティブ・コードの JNI を使用する場合は、JNI における長さ関連の数量が 64 ビットとして定義されていることを確認する必要があります。
Java™ Developer Kit (JDK) 内の基礎となるオブジェクトおよび数量が 32 ビット以下の値に制限されている場合でも、JNI における長さ関連の数量が 64 ビットとして定義されていることを確認する必要があります。 ネイティブ・コードがこれらの数量に 32 ビットより大きい値を使用すると、エラーが発生します。
JNIの定義は、JNIを使うネイティブ・コードに組み込まれる2つのヘッダー・ファイル(jni.hとjni_md.h)に保持されます。
64 ビット・バージョンの JDK では JNI インターフェース自体が次のように変わります。
- Pointers (foo *)
- すべてのポインターが 64 ビットになります。
- <jni_md.h> jint
- UNIX システムでは long は 64 ビット整数であるため、これは 32 ビット 値 (int) として定義されます。
- <jni.h> jsize
- このタイプは、長さを暗黙指定する数量に対して広範囲に使用されます。 これは、64 ビット・システムでは 64 ビットになるように jlong に変更されます。これに対して、 32 ビット ・システムでは jint( 32 ビット) という定義になります。
- jfloat, jdouble
- 値は、 32 ビット ・システムの場合と同じままです。
- jobject
- これはポインターとして定義されるため 64 ビットです。
- jclass, jthrowable, jstring, jarray
- すべてはjobjectとして宣言され、すべては64 ビットです。
- jvalue
- これはすべての基本「j」タイプの結合体であり、既に 64 ビットです。
- jmethodID, jfieldID
- これらはポインター・タイプとして宣言されるため、64 ビットの数量です。
- JNINativeMethod
- structは3 つのポインターであり、24 バイトになります。
- JNIEnv
- これはポインター・タイプとして宣言されるため、64 ビットです。
- JavaVM
- これはポインター・タイプとして宣言されるため、64 ビットです。
- JNINativeInterface
- 64 ビット・ポインターの配列として宣言されます。
- DefineClass
- これは、バッファー・パラメーターと関連サイズ・パラメーターを持ちます。 サイズ・パラメーターはjsizeとして宣言されるため、64ビット整数の長さになります。 ただし、クラス・オブジェクトをこのように大きくすることはできないため、 size パラメーターの値には上限があり、 32 ビット未満になります。
- PushLocalFrame
- jint によって定義される容量を持ち、 32 ビットに制限されます。
- EnsureLocalCapacity
- jint によって定義される容量を持ち、 32 ビットに制限されます。
- NewString
- jsize長さパラメーターを持ち、64 ビットになります。 ただし、指定されたユニコード・ストリングのサイズの最大長は、 32 ビット 整数以下になります。
- GetStringLength
- jsize(64 ビット) を返します。 Java ストリングの長さは、 32 ビット 整数値に制限されます。
- GetStringUTFLength
- jsize(64 ビット) を返します。 Java ストリングの長さは、 32 ビット 整数値に制限されます。
- GetArrayLength
- jsize(64 ビット) を返します。 ただし、Java 配列の長さは 32 ビット 整数値を超えることはできません。
- NewXxxArray
- (ここで、Xxxはプリミティブのタイプです。例えば、NewBooleanArrayです。) すべてに64ビットのjsize長さパラメータがあります。 Java 配列の長さは、 32 ビット 整数値を超えることはできません。
- GetObjectArrayElement, SetObjectArrayElement
- どちらにも、64ビットのjsize索引値があります。 Java 配列の長さは、 32 ビット 整数を超えることはできません。
- GetXxxArrayRegion, SetXxxArrayRegion
- (Xxxはプリミティブのタイプです。たとえば、GetIntArrayRegion、SetFloatArrayRegion)すべてにjsize開始フィールドと長さフィールドがあり、64ビットです。 Java 配列の長さは、 32 ビット 整数値を超えることはできません。
- RegisterNatives
- これは jint パラメーター (メソッド数) を持ちます。
- GetStringRegion, GetStringUTFRegion
- どちらもjsizeとして、開始と長さパラメータがあります。どちらも64ビットです。 ストリングの長さは 32 ビット に制限されています。
- JavaVMOption
- structには 2 つのポインターがあります。どちらも64 ビットです。
- JavaVMInitArgs
- このstructの位置合わせは、JavaVMOption structへの変更の影響を受けます。
- JavaVMAttachArgs
- 2 つのポインターが位置合わせに影響します。