Po przekazaniu znacznika jlong (który jest 64-bitowy) jako wskaźnika (który najprawdopodobniej jest 32-bitowy), konieczne jest utracenie danych. Nie jestem pewien, co to jest konwencja, ale spróbuj albo to:
CallStaticVoidMethodA(myClass, "(J)V", (jvalue*)&val); //Note address-of!
lub to:
CallStaticVoidMethod(myClass, "(J)V", val);
To ...A
metod, które zajmują się jvalue tablicę, metody bez przyrostkowe wziąć odpowiedniki C do skalara Typy Java.
Pierwszy fragment jest nieco niebezpieczny; lepiej, gdyby bardziej gadatliwy, alternatywą byłoby:
jvalue jv;
jv.j = val;
CallStaticVoidMethodA(myClass, "(J)V", &jv);
Na niektórych egzotycznych archtectures CPU, wymagania wyrównania dla jlong
zmiennych i jvalue
związków mogą być różne. Kiedy jawnie deklarujesz związek, kompilator się tym zajmuje. Uwaga: Typ danych C++ long
C++ jest często 32-bitowy. jlong ma 64 bity, na 32-bitowych platformach niestandardowy odpowiednik C to long long
lub __int64
.
'długo! = Jlong' może? – quasiverse
Co ciekawe, Java otrzymywała 4294967297, gdy przekazałem mu wartość "1" przez JNI. Ta liczba to numer Fermata. Wydaje się to niezwykle przypadkową wartością. Jeśli ktoś ma jakieś pomysły, dlaczego ta konkretna wartość była widoczna, byłbym zainteresowany słuchaniem tego. Wracając do tematu, przesłanie mojego long jako '(jlong) value 'pozwoliło Java/JNI przeanalizować go do poprawnej wartości 1. – StockB
4294967297 is (1 << 32) + 1 – samgak