Я создаю приложение для обработки изображений для android. Мой процессор изображений написан на C ++, и я пытаюсь использовать его в android через JNI. Мне нужен эффективный способ записи пиксельного буфера, который у меня есть на C ++, в виджет ImageView.
В настоящее время у меня есть собственная функция, которая принимает массив байтов в качестве параметра и выполняет необходимую обработку этого массива байтов .
Java
public native void GetPixelData(byte[] pixels);
(ниже - псевдокод. Я использую правильные сигнатуры / синтаксис функций в моем коде.)
C ++
com_..._GetPixelData(env, jbyteArray pixels)
{
jbyte* pixelData = env->GetByteArrayElements(pixels, NULL);
if(pixelData != NULL)
{
// do the required processing on pixel array
env->ReleaseByteArrayElements(..., JNI_COMMIT);
}
}
и в java, я обновляю растровое изображение через Bitmap.SetPixels, используя эти новые данные пикселей.
Все работает, как ожидалось, но Я читал, что GetByteArrayElements может копировать, а может и не копировать данные. Итак, насколько я понимаю, в случае, если он копирует массив байтов из java в C ++, ему также придется скопировать обратно изменения. Итак, это две копии этой функции. Я довольно часто вызываю эту функцию GetPixelData в приложении.
Итак, мой вопрос: есть ли способ
- Получить доступ к байтовому массиву из C ++ способом, который гарантированно не копия будет иметь место. В основном есть другая функция, такая как GetByteArrayElements или любой другой метод, который никогда не копирует данные, но возвращает указатель на данные в java куче.
Кроме того, есть ли способ получить прямой доступ к Внутренний буфер ImageView, чтобы я мог его модифицировать вместо копирования в растровое изображение и использования растрового изображения в ImageView?
Если нет возможности сделать это без этих дополнительных копий и если эти копии существенно влияют на производительность, я готов переписать процессор изображений на java.