JNI考慮事項

64 ビット・システムでネイティブ・コードの JNI を使用する場合は、JNI における長さ関連の数量が 64 ビットとして定義されていることを確認する必要があります。

Java™ Developer Kit (JDK) 内の基礎となるオブジェクトおよび数量が 32 ビット以下の値に制限されている場合でも、JNI における長さ関連の数量が 64 ビットとして定義されていることを確認する必要があります。 ネイティブ・コードがこれらの数量に 32 ビットより大きい値を使用すると、エラーが発生します。

JNIの定義は、JNIを使うネイティブ・コードに組み込まれる2つのヘッダー・ファイル(jni.hjni_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はプリミティブのタイプです。たとえば、GetIntArrayRegionSetFloatArrayRegion)すべてにjsize開始フィールドと長さフィールドがあり、64ビットです。 Java 配列の長さは、 32 ビット 整数値を超えることはできません。
RegisterNatives
これは jint パラメーター (メソッド数) を持ちます。
GetStringRegion, GetStringUTFRegion
どちらもjsizeとして、開始と長さパラメータがあります。どちらも64ビットです。 ストリングの長さは 32 ビット に制限されています。
JavaVMOption
structには 2 つのポインターがあります。どちらも64 ビットです。
JavaVMInitArgs
このstructの位置合わせは、JavaVMOption structへの変更の影響を受けます。
JavaVMAttachArgs
2 つのポインターが位置合わせに影響します。