Lorsque vous passez un jlong (qui est 64 bits) en tant que pointeur (qui est, très probablement, 32 bits), vous perdez nécessairement des données. Je ne sais pas quelle est la convention, mais vous pouvez soit essayer ceci:
CallStaticVoidMethodA(myClass, "(J)V", (jvalue*)&val); //Note address-of!
ou ceci:
CallStaticVoidMethod(myClass, "(J)V", val);
Il est ...A
méthodes qui prennent un tableau jvalue, les méthodes non-Postfix prennent équivalents C à scalaire Types Java.
Le premier extrait est quelque peu dangereux; mieux, si plus bavard, alternative serait:
jvalue jv;
jv.j = val;
CallStaticVoidMethodA(myClass, "(J)V", &jv);
Sur certains archtectures CPU exotiques, les exigences d'alignement pour jlong
variables et jvalue
syndicats peuvent être différents. Lorsque vous déclarez une union explicitement, le compilateur s'en charge.
Notez également que le type de données C++ long
est souvent de 32 bits. jlong est 64 bits, sur les plates-formes 32 bits, l'équivalent C non standard est long long
ou __int64
.
'long! = Jlong' peut-être? – quasiverse
Curieusement, Java a continué à obtenir 4294967297 quand je lui ai passé une valeur de "1" à travers JNI. Ce nombre est un nombre de Fermat. Cela semble terriblement coïncident. Si quelqu'un a des idées sur la raison pour laquelle cette valeur particulière a été vue, je serais intéressé à l'entendre. De retour sur le sujet, lancer ma longueur comme '(jlong) value' a permis à Java/JNI de l'analyser à la valeur correcte de 1. – StockB
4294967297 est (1 << 32) + 1 – samgak