Tôi có một ứng dụng Java sử dụng DLL C++ qua JNI. Một vài phương thức của DLL lấy các đối số chuỗi và một số trong số chúng trả về các đối tượng có chứa các chuỗi.Truyền chuỗi hai byte (WCHAR) từ C++ sang Java qua JNI
Hiện nay DLL không hỗ trợ Unicode, vì vậy việc xử lý chuỗi là khá dễ dàng:
- Java gọi String.getBytes() và vượt qua các mảng kết quả vào DLL, mà chỉ đơn giản xử lý các dữ liệu như một char *.
- DLL sử dụng NewStringUTF() để tạo một chuỗi từ một const char *.
Tôi hiện đang trong quá trình sửa đổi DLL để hỗ trợ Unicode, chuyển sang sử dụng loại TCHAR (khi UNICODE được định nghĩa sử dụng kiểu dữ liệu WCHAR của Windows). Sửa đổi các DLL đang diễn ra tốt đẹp, nhưng tôi không chắc chắn làm thế nào để sửa đổi phần JNI của mã.
Điều duy nhất tôi có thể nghĩ ngay bây giờ là thế này:
- Java gọi String.getBytes (String charsetName) và vượt qua các mảng kết quả vào DLL, mà xử lý các dữ liệu như một wchar_t *.
- DLL không còn tạo chuỗi, nhưng thay vào đó chuyển jbyteArrays bằng dữ liệu chuỗi thô. Java sử dụng hàm tạo String (byte [] bytes, String charsetName) để tạo chuỗi.
Vấn đề duy nhất với phương pháp này là tôi không chắc chắn nên sử dụng tên bộ ký tự nào. WCHARs dài 2 byte, vì vậy tôi khá chắc chắn đó là UTF-16, nhưng có 3 vị trí ở phía java. UTF-16, UTF-16BE và UTF-16LE. Tôi đã không tìm thấy bất kỳ tài liệu nào cho tôi biết thứ tự byte là gì, nhưng tôi có thể tìm ra nó từ một số thử nghiệm nhanh.
Có cách nào tốt hơn không? Nếu có thể tôi muốn tiếp tục xây dựng các đối tượng jstring trong DLL, như vậy tôi sẽ không phải sửa đổi bất kỳ tập quán nào của các phương thức đó. Tuy nhiên, phương thức NewString JNI không nhận định danh ký tự.
Hm, đã không xem xét việc chuyển đổi chuỗi char rộng thành chuỗi utf-8 trước tiên. Tôi giả sử sử dụng phương pháp đó tôi muốn đối số mã CP_UTF8? – Herms
Có, đối số CodePage phải là CP_UTF8. –
Cảm ơn mã ví dụ. Tôi đã không hoàn toàn chắc chắn về một vài lý lẽ đó, và thật tuyệt khi được xác nhận rằng tôi đoán đúng. :) – Herms