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.