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.