Cuando pasa un jlong (que es de 64 bits) como un puntero (que es, muy probablemente, de 32 bits), necesariamente pierde datos. No estoy seguro de cuál es la convención, pero trato, ya sea esto:
CallStaticVoidMethodA(myClass, "(J)V", (jvalue*)&val); //Note address-of!
o esto:
CallStaticVoidMethod(myClass, "(J)V", val);
¡Es ...A
métodos que toman una matriz jvalue, los métodos no-postfijos la C equivalentes a escalar Tipos de Java.
El primer fragmento es algo inseguro; una mejor, si más detallado, alternativa sería:
jvalue jv;
jv.j = val;
CallStaticVoidMethodA(myClass, "(J)V", &jv);
En algunos archtectures CPU exóticos, los requisitos de alineación para jlong
variables y jvalue
sindicatos podrían ser diferentes. Cuando declaras una unión explícitamente, el compilador se encarga de eso.
También tenga en cuenta que C++ long
datatype es a menudo de 32 bits. jlong es de 64 bits, en plataformas de 32 bits, el equivalente en C no estándar es long long
o __int64
.
'long! = Jlong' ¿quizás? – quasiverse
Curiosamente, Java siguió obteniendo 4294967297 cuando pasé un valor de "1" a través de JNI. Ese número es un número de Fermat. Parece un valor tremendamente casual. Si alguien tiene alguna idea sobre por qué se vio este valor en particular, estaría interesado en escucharlo. Volviendo al tema, el lanzamiento de mi valor largo como '(jlong) value permitió que Java/JNI lo analizara con el valor correcto de 1. – StockB
4294967297 is (1 << 32) + 1 – samgak