Использование ashmem между собственным процессом и службой Java без больших накладных расходов

Я пытаюсь настроить область общей памяти между службой Android Java и собственным процессом. Нативный процесс не имеет компонента Java, является чисто C++ и вызывается из оболочки непосредственно из командной строки. Приложение должно отправить полные изображения (в настоящее время около 300 МБ) в службу. Изображения являются данными с плавающей запятой.

Я считаю, что я могу использовать пепел и связующее вещество для достижения этой цели. Сначала вызовите ashmem_create_region, вызовите mmap для результата, затем передайте полученный fd другому процессу, используя связыватель. Другой процесс выполняет mmap для fd и, таким образом, получает доступ к совместно используемой области.

Я понимаю, что это работает между двумя приложениями Java, а также между приложением или службой Java и процессом в основном режиме.

Мне интересно, как сервис Java может эффективно обращаться к данным. Я хочу использовать этот механизм для копирования буфера с плавающей точкой, размером около 300 МБ, из нативного приложения в службу Java. Теперь службе Java требуется доступ к этим данным без больших накладных расходов. Мне сказали, что издержки JNI не позволяют использовать эту технику из-за стоимости доступа к данным из службы Java. Это правильно? Есть ли другой способ сделать это без больших накладных расходов?

Например, может ли сервис Java выделить данные как ByteBuffer и затем позволить нативному сервису обращаться к ним через указатель?

Спасибо

0 ответов

Другие вопросы по тегам