Khi bạn vượt qua một jlong (64 bit) làm con trỏ (rất có thể, 32-bit), bạn nhất thiết phải mất dữ liệu. Tôi không chắc chắn quy ước là gì, nhưng thử một trong hai điều này:
CallStaticVoidMethodA(myClass, "(J)V", (jvalue*)&val); //Note address-of!
hay này:
CallStaticVoidMethod(myClass, "(J)V", val);
Đó là ...A
phương pháp mà phải mất một mảng jvalue, các phương pháp không postfix mất C tương đương với vô hướng Các loại Java.
Đoạn đầu tiên có phần không an toàn; một tốt hơn, nếu tiết hơn, thay thế sẽ là:
jvalue jv;
jv.j = val;
CallStaticVoidMethodA(myClass, "(J)V", &jv);
Trên một số archtectures CPU kỳ lạ, các yêu cầu liên kết cho jlong
biến và jvalue
đoàn thể có thể khác. Khi bạn khai báo một liên minh một cách rõ ràng, trình biên dịch sẽ xử lý điều đó.
Cũng lưu ý rằng C++ long
kiểu dữ liệu thường là 32 bit. jlong là 64 bit, trên nền tảng 32 bit tương đương C không chuẩn là long long
hoặc __int64
.
Nguồn
2011-09-24 01:56:56
'long! = Jlong' có thể? – quasiverse
Thật kỳ lạ, Java tiếp tục nhận được 4294967297 khi tôi thông qua nó một giá trị "1" thông qua JNI. Con số đó là một số Fermat. Có vẻ như một giá trị ngẫu nhiên khủng khiếp. Nếu bất cứ ai có bất kỳ ý tưởng nào về lý do tại sao giá trị cụ thể này được nhìn thấy, tôi muốn được nghe nó. Quay lại chủ đề, hãy gán giá trị '(jlong) dài của tôi cho phép Java/JNI phân tích cú pháp thành giá trị chính xác của 1. – StockB
4294967297 là (1 << 32) + 1 – samgak