2011-07-01 33 views
9

Tôi đã lưu trữ con trỏ c trong Java thông qua JNI bằng cách làm theo những lời khuyên của @tulskiy trong bài viết này Passing pointers between C and Java through JNIĐi qua con trỏ giữa C và Java thông qua JNI

Bí quyết là để cast con trỏ như một jlong. Vì vậy, từ c Tôi có return (jlong) ptr;

Tôi trả về một jlong ​​(luôn luôn 64 bit) vì tôi muốn mã của tôi hoạt động trên cả hệ thống 64 và 32 bit. Kích thước trong bộ nhớ của một con trỏ 64 bit trên một máy tính 64 bit là 64 và nó sau đó trên một máy tính 32-bit, kích thước của con trỏ trong bộ nhớ là 32 bit.

Vấn đề là trên máy 32 bit, tôi nhận được cảnh báo trình biên dịch nói rằng "truyền tới số nguyên từ con trỏ có kích thước khác". Cảnh báo sẽ biến mất nếu tôi có return (jlong) (int32_t) ptr; Tuy nhiên mã này không tốt cho máy 64 bit.

Tôi muốn biên dịch mã của mình mà không có cảnh báo để nếu có cảnh báo hợp pháp, tôi sẽ thấy nó. Ai có ý tưởng gì không?

Cảm ơn, Bến

Trả lời

11

Có nhiều loại nguyên tiện dụng khác nhau trong C. Các bạn muốn có lẽ là intptr_t hoặc uintptr_t:

return (jlong)(intptr_t) ptr; 

Sự khác biệt?

  • Đúc intptr_t-jlong và trở lại là bảo đảm để làm việc cung cấp jlong là đủ lớn (mà bạn đang ngầm giả định nó là anyway).
  • Đúc uinttptr_t-jlong và lại tránh được một đăng nhập mở rộng, nhưng là hành vi không xác định nếu uintptr_t là quá lớn để vừa trong một jlong (nhưng tất cả "lành mạnh" kiến ​​trúc/trình biên dịch chỉ cần sử dụng hai của số học bổ sung)
1

Hãy thử đúc với intptr_t (lưu trữ một con trỏ không phụ thuộc vào khả năng nền tảng).

Các vấn đề liên quan