Запись в Java память из C / C ++ - PullRequest
0 голосов
/ 01 августа 2020

Я создаю приложение для обработки изображений для 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 в приложении.

Итак, мой вопрос: есть ли способ

  1. Получить доступ к байтовому массиву из C ++ способом, который гарантированно не копия будет иметь место. В основном есть другая функция, такая как GetByteArrayElements или любой другой метод, который никогда не копирует данные, но возвращает указатель на данные в java куче.

Кроме того, есть ли способ получить прямой доступ к Внутренний буфер ImageView, чтобы я мог его модифицировать вместо копирования в растровое изображение и использования растрового изображения в ImageView?

Если нет возможности сделать это без этих дополнительных копий и если эти копии существенно влияют на производительность, я готов переписать процессор изображений на java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...