Considerações da JNI
Se você usar a JNI a partir do código nativo em um sistema de 64 bits, assegure-se de que as quantidades relacionadas ao comprimento na JNI estejam definidas como 64 bits.
Deve-se assegurar que as quantidades relacionadas ao comprimento na JNI sejam definidas como 64 bits, embora os objetos subjacentes e as quantidades no Java™ Developer Kit (JDK) sejam restritos a valores não maiores que 32 bits. Ocorre um erro se o código nativo usar valores maiores que 32 bits para essas quantidades.
A definição da JNI está mantida em dois arquivos de cabeçalho (jni.h e jni_md.h), que são incluídos por qualquer código nativo que usa JNI.
Em uma versão 64 de bits do JDK, a interface JNI em si muda como segue:
- Pointers (foo *)
- Todos os ponteiros se tornam 64 bits.
- <jni_md.h> jint
- Isso é definido como um valor 32-bit (int), já que em sistemas Unix um long é um número inteiro de 64 bits.
- <jni.h> jsize
- Esse tipo é usado extensivamente para quantidades que implicam comprimentos. Isso é alterado em sistemas de 64 bits para um jlong para que seja 64 bits, em contraste com a definição em sistemas de 32 bits em que ele é um jint, que é 32 bits.
- jfloat, jdouble
- Os valores permanecem os mesmos que em sistemas de 32 bits .
- jobject
- Definido como um ponteiro e, assim, é de 64 bits.
- jclass, jthrowable, jstring, jarray
- Tudo declarado como jobject e todos são de 64 bits.
- jvalue
- Uma união de todos os tipos 'j' básicos e já é de 64 bits.
- jmethodID, jfieldID
- Declarado como tipos de ponteiro e são quantidades de 64 bits.
- JNINativeMethod
- struct é 3 ponteiros e se torna 24 bytes.
- JNIEnv
- Declarado como um tipo de ponteiro e contendo 64 bits.
- JavaVM
- Declarado como um tipo de ponteiro e contendo 64 bits.
- JNINativeInterface
- Declarado como uma matriz de ponteiros de 64 bits.
- DefineClass
- Possui um parâmetro de buffer com um parâmetro de tamanho associado. O parâmetro de tamanho é declarado como um jsize e, portanto, é um comprimento de número inteiro de 64 bits. No entanto, os objetos de classe não podem ser tão grandes, portanto, há um limite superior para o valor do parâmetro size e é menor que 32 bits.
- PushLocalFrame
- Tem uma capacidade definida por um jint e é limitada a 32 bits
- EnsureLocalCapacity
- Tem uma capacidade definida por um jint e é limitada a 32 bits
- NewString
- Possui um parâmetro de comprimento jsize e se torna 64 bits. No entanto, o tamanho da sequência unicode fornecida possui um comprimento máximo não maior que um número inteiro de 32 bits ..
- GetStringLength
- Retorna um jsize, que é de 64 bits. O comprimento de uma sequência Java é limitado a valores de número inteiro de 32-bit .
- GetStringUTFLength
- Retorna um jsize, que é de 64 bits. O comprimento de uma sequência Java é limitado a valores de número inteiro de 32-bit .
- GetArrayLength
- Retorna um jsize, que é de 64 bits. No entanto, as matrizes Java não podem ter um comprimento maior que um valor de número inteiro de 32 bits .
- NewXxxArray
- (em que Xxx é o tipo de uma primitiva: por exemplo, NewBooleanArray). Todos têm parâmetros de comprimento jsize, que são 64 bits. As matrizes Java não podem ter um comprimento maior que um valor inteiro de 32 bits .
- GetObjectArrayElement, SetObjectArrayElement
- Ambos possuem valores de índice jsize que são de 64 bits. As matrizes Java não podem ter um comprimento maior que um número inteiro 32 bits .
- GetXxxArrayRegion, SetXxxArrayRegion
- (em que Xxx é o tipo de uma primitiva: por exemplo, GetIntArrayRegion, SetFloatArrayRegion.) Todos têm jsize campos de início e comprimento, que são 64 bits. As matrizes Java não podem ter um comprimento maior que o valor de número inteiro de 32 bits .
- RegisterNatives
- Tem um parâmetro jint, que é o número de métodos.
- GetStringRegion, GetStringUTFRegion
- Ambos têm parâmetros de início e de comprimento como jsize, que são de 64 bits. Sequências são limitadas a comprimentos de 32 bits .
- JavaVMOption
- struct possui dois ponteiros: ambos se tornam 64 bits.
- JavaVMInitArgs
- O alinhamento do struct é afetado por mudanças no JavaVMOption struct.
- JavaVMAttachArgs
- O alinhamento é afetado por dois ponteiros.