Tôi có một số mã Java xử lý hình ảnh trong Android hoạt động trên hai mảng int lớn. Hầu hết thời gian, Java đủ nhanh nhưng tôi cần sử dụng C thông qua JNI và NDK để tăng tốc một số thao tác.Gửi int [] s giữa Java và C
Cách duy nhất tôi biết rằng tôi có thể chuyển dữ liệu từ mảng int sang C là sử dụng ByteBuffer.allocateDirect để tạo bộ đệm mới, sao chép dữ liệu vào đó và sau đó làm cho mã C hoạt động trên bộ đệm.
Tuy nhiên, tôi không thể thấy bất kỳ cách nào tôi có thể thao tác dữ liệu trong bộ đệm này trong Java như thể bộ đệm là một int [] hoặc một byte []. Ví dụ, một cuộc gọi đến ByteBuffer.array() sẽ thất bại trên bộ đệm mới được tạo ra. Có cách nào để thực hiện công việc này không?
Tôi có bộ nhớ hạn chế và muốn giảm số lượng mảng/bộ đệm tôi cần. Ví dụ, nó sẽ là tốt đẹp nếu tôi có thể sử dụng IntBuffer.wrap (new int [...]) để tạo bộ đệm và sau đó thao tác mảng sao lưu bộ đệm trực tiếp trong Java nhưng tôi không thể làm điều này bởi vì điều duy nhất mà dường như làm việc ở đây cho JNI là ByteBuffer.allocateDirect.
Có cách nào khác để gửi dữ liệu qua lại giữa C và Java không? Tôi có thể bằng cách nào đó phân bổ bộ nhớ ở phía C và có Java gửi dữ liệu trực tiếp đến đó?
Edit: Một benchmark so sánh sử dụng đệm để int [] sử dụng:
int size = 1000;
IntBuffer allocateDirect = java.nio.ByteBuffer.allocateDirect(4 * size).asIntBuffer();
for (int i = 0; i < 100; ++i)
{
for (int x = 0; x < size; ++x)
{
int v = allocateDirect.get(x);
allocateDirect.put(x, v + 1);
}
}
int[] intArray = new int[size];
for (int i = 0; i < 100; ++i)
{
for (int x = 0; x < size; ++x)
{
int v = intArray[x];
intArray[x] = v + 1;
}
}
Trên điện thoại Droid, phiên bản đệm mất ~ 10 giây để hoàn thành và phiên bản mảng mất ~ 0,01 giây.
Chờ, có chuyện gì với [ 'ByteBuffer.asIntBuffer'] (http://developer.android.com/reference/java/nio/ByteBuffer.html#asIntBuffer%28%29)? Bạn có thực sự cần phải có một 'int []'? – ephemient
... và hơn nữa, bạn có thể gọi .array() trên IntBuffer nếu bạn muốn. – mpontillo
.array() ném một ngoại lệ không được hỗ trợ cho cả ByteBuffer và IntBuffer cho các mảng được cấp phát trực tiếp trong Java. Tôi thực sự muốn truy cập vào int [] để tôi có thể thực hiện một số công cụ xử lý hình ảnh ít tốn kém hơn trong Java, ví dụ: chuyển đổi một hình ảnh thành màu đen và trắng bằng cách kiểm tra các pixel nào nằm trên/dưới ngưỡng sáng. Sử dụng IntBuffer get/put cho mỗi pixel sẽ quá chậm trong Android cũng như vụng về. – rbcc