Considerazioni su JNI

Se si utilizza JNI dal codice nativo su un sistema a 64 bit, è necessario assicurarsi che le quantità relative alla lunghezza in JNI siano definite come a 64 bit.

È necessario assicurarsi che le quantità relative alla lunghezza in JNI siano definite a 64 bit anche se gli oggetti sottostanti e le quantità all'interno di JDK (Java™ Developer Kit) sono limitati a valori non superiori a 32 bit. Si verifica un errore se il codice nativo utilizza valori maggiori di 32 bit per queste quantità.

La definizione di JNI è contenuta in due file di intestazione (jni.h e jni_md.h), inclusi da qualsiasi codice nativo che utilizza JNI.

In una versione a 64 bit del JDK, l'interfaccia JNI stessa cambia come segue:

Pointers (foo *)
Tutti i puntatori diventano 64 bit.
<jni_md.h> jint
È definito come un valore a 32 bit (int), poiché su sistemi Unix long è un numero intero a 64 bit.
<jni.h> jsize
Questo tipo è ampiamente utilizzato per quantità che implicano lunghezze. Viene modificato su sistemi a 64 bit in un jlong in modo che sia a 64 bit, in contrasto con la definizione su sistemi a 32 bit in cui è un jint, che è 32 bit.
jfloat, jdouble
I valori rimangono gli stessi dei sistemi a 32 bit .
jobject
Definito come un puntatore e così è 64 bit.
jclass, jthrowable, jstring, jarray
Tutti dichiarati come jobject e sono tutti a 64 bit.
jvalue
Un'unione di tutti i tipi 'j' di base ed è già a 64 bit.
jmethodID, jfieldID
Dichiarati come tipi di puntatore e sono quantità a 64 bit.
JNINativeMethod
struct è 3 puntatori e diventa 24 byte.
JNIEnv
Dichiarato come tipo di puntatore ed è a 64 bit.
JavaVM
Dichiarato come tipo di puntatore ed è a 64 bit.
JNINativeInterface
Dichiarato come array di puntatori a 64 bit.
DefineClass
Ha un parametro di buffer con un parametro di dimensione associato. Il parametro della dimensione è dichiarato come jsize e quindi è una lunghezza intera a 64 bit. Tuttavia, gli oggetti della classe non possono essere così grandi, quindi esiste un limite superiore al valore del parametro size ed è inferiore a 32 bit.
PushLocalFrame
Ha una capacità definita da un jint ed è limitata a 32 bit.
EnsureLocalCapacity
Ha una capacità definita da un jint ed è limitata a 32 bit.
NewString
Ha un parametro di lunghezza jsize e diventa 64 bit. Tuttavia, la dimensione della stringa unicode fornita ha una lunghezza massima non superiore a un numero intero a 32 bit .
GetStringLength
Restituisce un jsize, che è a 64 bit. La lunghezza di una stringa Java è limitata a valori interi a 32 bit .
GetStringUTFLength
Restituisce un jsize, che è a 64 bit. La lunghezza di una stringa Java è limitata a valori interi a 32 bit .
GetArrayLength
Restituisce un jsize, che è a 64 bit. Tuttavia, gli array Java non possono avere una lunghezza maggiore di un valore intero a 32 bit .
NewXxxArray
(dove Xxx è il tipo di una primitiva: ad esempio, NewBooleanArray.) Tutti hanno parametri di lunghezza jsize , che sono 64 bit. Gli array Java non possono avere una lunghezza maggiore di un numero intero a 32 bit .
GetObjectArrayElement, SetObjectArrayElement
Entrambi hanno valori di indice jsize a 64 bit. Gli array Java non possono avere una lunghezza maggiore di un numero intero a 32 bit .
GetXxxArrayRegion, SetXxxArrayRegion
(dove Xxx è il tipo di una primitiva: ad esempio, GetIntArrayRegion, SetFloatArrayRegion.) Tutti hanno jsize campi di inizio e di lunghezza, che sono a 64 bit. Le matrici Java non possono avere una lunghezza superiore al valore intero a 32 bit .
RegisterNatives
Ha un parametro jint - numero di metodi.
GetStringRegion, GetStringUTFRegion
Entrambi hanno parametri di inizio e di lunghezza come jsize, che sono a 64 bit. Le stringhe sono limitate a 32 bit lunghezze.
JavaVMOption
struct ha due puntatori: entrambi diventano 64 bit.
JavaVMInitArgs
L'allineamento di questo struct è influenzato dalla modifica a JavaVMOption struct.
JavaVMAttachArgs
L'allineamento è influenzato da due puntatori.