Consideraciones de JNI
Si utiliza JNI a partir de código nativo en un sistema de 64 bits, debe asegurarse de que las cantidades relacionadas con la longitud en JNI estén definidas como 64 bits.
Debe asegurarse de que las cantidades relacionadas con la longitud en JNI estén definidas como de 64 bits aunque los objetos subyacentes y las cantidades dentro de JDK (Java™ Developer Kit) estén restringidas a valores que no sean mayores de 32 bits. Se produce un error si el código nativo utiliza valores mayores que 32 bits para estas cantidades.
La definición de JNI se mantiene en dos archivos de cabecera (jni.h y jni_md.h), que se incluyen en cualquier código nativo que utilice JNI.
En una versión de 64 bits del JDK, la propia interfaz de JNI cambia de la siguiente manera:
- Pointers (foo *)
- Todos los punteros se convertirán a 64 bits.
- <jni_md.h> jint
- Esto se define como un valor de 32 bits (int), ya que en sistemas Unix un long es un entero de 64 bits.
- <jni.h> jsize
- Este tipo se utiliza ampliamente para cantidades que implican longitudes. Esto se cambia en sistemas de 64 bits a un jlong para que sea de 64 bits, en contraste con la definición en sistemas de 32 bits donde es un jint, que es de 32 bits.
- jfloat, jdouble
- Los valores siguen siendo los mismos que en los sistemas de 32 bits .
- jobject
- Definido como un puntero y, por lo tanto, es de 64 bits.
- jclass, jthrowable, jstring, jarray
- Todos declarados como jobject y todos de 64 bits.
- jvalue
- Una unión de todos los tipos 'j' básicos y que ya es de 64 bits.
- jmethodID, jfieldID
- Declarados como tipos de puntero y son de cantidades de 64 bits.
- JNINativeMethod
- struct es 3 punteros y se convierte en 24 bytes.
- JNIEnv
- Declarado como un tipo de puntero y es de 64 bits.
- JavaVM
- Declarado como un tipo de puntero y es de 64 bits.
- JNINativeInterface
- Declarado como una matriz de punteros de 64 bits.
- DefineClass
- Tiene un parámetro de almacenamiento intermedio con un parámetro size asociado. El parámetro de tamaño se declara como jsize y, por lo tanto, es una longitud de entero de 64 bits. Sin embargo, los objetos de clase no pueden ser tan grandes, por lo que hay un límite superior al valor del parámetro size y es menor que 32 bits.
- PushLocalFrame
- Tiene una capacidad definida por un jint y está limitada a 32 bits.
- EnsureLocalCapacity
- Tiene una capacidad definida por un jint y está limitada a 32 bits.
- NewString
- Tiene un parámetro de longitud jsize y se convierte a 64 bits. Sin embargo, el tamaño de la serie Unicode proporcionada no tiene una longitud máxima mayor que un entero de 32 bits .
- GetStringLength
- Devuelve un jsize, que es de 64 bits. La longitud de una serie Java está limitada a valores enteros de 32 bits .
- GetStringUTFLength
- Devuelve un jsize, que es de 64 bits. La longitud de una serie Java está limitada a valores enteros de 32 bits .
- GetArrayLength
- Devuelve un jsize, que es de 64 bits. Sin embargo, las matrices Java no pueden tener una longitud mayor que un valor entero de 32 bits .
- NewXxxArray
- (donde Xxx es el tipo de un primitivo: por ejemplo, NewBooleanArray.) Todos tienen parámetros de longitud de jsize, que son de 64 bits. Las matrices Java no pueden tener una longitud mayor que un valor entero de 32 bits .
- GetObjectArrayElement, SetObjectArrayElement
- Ambos tienen valores de índice de jsize que son de 64 bits. Las matrices Java no pueden tener una longitud mayor que un entero de 32 bits .
- GetXxxArrayRegion, SetXxxArrayRegion
- (donde Xxx es el tipo de un primitivo: por ejemplo, GetIntArrayRegion, SetFloatArrayRegion.) Todos tienen campos de inicio y longitud de jsize, que son de 64 bits. Las matrices Java no pueden tener una longitud mayor que el valor entero de 32 bits .
- RegisterNatives
- Tiene un parámetro jint -número de métodos.
- GetStringRegion, GetStringUTFRegion
- Ambos tienen parámetros de inicio y de longitud como jsize, que son de 64 bits. Las series están limitadas a longitudes de 32 bits .
- JavaVMOption
- struct tiene dos punteros: ambos se convierten a 64 bits.
- JavaVMInitArgs
- La alineación de este struct se ve afectada por el cambio en JavaVMOption struct.
- JavaVMAttachArgs
- La alineación se ve afectada por dos punteros.