Tôi có một dự án Android (nhắm mục tiêu Android 1.6 trở lên) bao gồm mã gốc được viết bằng C/C++, được truy cập thông qua NDK. Tôi tự hỏi cách hiệu quả nhất là truyền một mảng các byte từ Java thông qua NDK đến lớp keo JNI của tôi. Mối quan tâm của tôi là có hay không NDK cho Android sẽ sao chép mảng byte hoặc chỉ cho tôi tham chiếu trực tiếp. Tôi cần truy cập chỉ đọc vào các byte ở cấp độ C++, vì vậy bất kỳ sự sao chép nào đằng sau hậu trường sẽ là một sự lãng phí thời gian từ quan điểm của tôi.Android: Cách hiệu quả nhất để chuyển một số byte chỉ đọc tới C++
Thật dễ dàng để tìm thông tin về điều này trên web, nhưng tôi không chắc chắn thông tin thích hợp nhất là gì. Ví dụ:
Get the pointer of a Java ByteBuffer though JNI
http://www.milk.com/kodebase/dalvik-docs-mirror/docs/jni-tips.html
http://elliotth.blogspot.com/2007/03/optimizing-jni-array-access.html
Vì vậy, không ai biết là tốt nhất (hiệu quả nhất, ít nhất là sao chép) cách để làm điều này trong NDK hiện nay là gì? GetByteArrayRegion? GetByteArrayElements? Thứ gì khác?
Có API tương tự hiệu quả nào để làm ngược lại không? - chuyển 'unsigned char *' từ lớp gốc sang lớp Java dưới dạng 'byte []' hoặc 'byteBuffer'? –
Cả ByteBuffer trực tiếp và byte [] đều có thể được sử dụng để đọc/ghi từ/sang phía gốc. Bạn có thể sử dụng chức năng memcopy của C để đọc/sao chép, một khi bạn đã gọi env-> GetDirectBufferAddress (buffer) hoặc env-> Get ArrayElements (mảng, ...). NHƯNG trực tiếp ByteBuffer nhanh hơn nhiều, không phát bản sao, an toàn hơn, v.v. –