2011-12-08 39 views
12

Tôi đang cố gắng chuyển đổi một jbyteArray thành chuỗi c gốc (char *) trong jni? Rất tiếc, tôi không thể tìm thấy bất kỳ tài liệu nào về cách thực hiện điều đó. Tôi đang gọi một hàm java với nguyên mẫu sau trong mã c.Làm thế nào để chuyển đổi jbyteArray thành char bản địa * trong jni?

public static byte[] processFile(byte[] p_fileContent) 

Trong mã c tôi đang gọi hàm này trả về mảng byte. Nội dung của mảng byte này là một chuỗi java. Nhưng tôi cần phải chuyển nó thành chuỗi c.

jbyteArray arr = (jbyteArray) env->CallObjectMethod(clsH, midMain, jb); 
printf("%s\n", (char*) arr); 

Trả lời

17

Tôi tin rằng bạn sẽ sử dụng GetByteArrayElementsReleaseByteArrayElements. Một cái gì đó như:

boolean isCopy; 
jbyte* b = GetByteArrayElements(env, arr, &isCopy); 

Bạn sẽ có thể đúc b-char* vào thời điểm này để truy cập dữ liệu trong mảng. Lưu ý rằng điều này có thể tạo ra một bản sao của dữ liệu, vì vậy bạn sẽ muốn chắc chắn để giải phóng bộ nhớ sử dụng ReleaseByteArrayElements:

ReleaseByteArrayElements(env, arr, b, 0); 

Tham số cuối cùng là một chế độ chỉ ra cách thay đổi b cần được xử lý. 0 cho biết rằng các giá trị được sao chép trở lại arr. Nếu bạn không muốn sao chép dữ liệu về arr, hãy sử dụng JNI_ABORT để thay thế.

Để biết thêm chi tiết, xem JNI Reference.

+0

Liên kết của bạn bị hỏng. Vui lòng cập nhật. –

+0

@DRH Cập nhật liên kết 1.4.2 đến liên kết 1.5 không có nhiều cải tiến. – EJP

+0

Cẩn thận sẽ không chấm dứt. Nói chung, nội dung tập tin sẽ không bị vô hiệu hóa; Các hàm chuỗi C (++) có thể bị nghẹt thở. Để làm việc xung quanh một cách đáng tin cậy, bạn phải sao chép các byte của tệp vào bộ đệm lớn hơn một byte và đặt byte cuối cùng thành 0 –

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