Каков самый быстрый способ передачи массивов данных через JNI? - PullRequest
0 голосов
/ 12 июля 2020

Я разрабатываю приложение Android, используя собственный код для Oboe. Я генерирую данные на стороне C ++, и мне нужно отрисовать эти данные в пользовательском представлении. Я также сгенерировал данные для гобоя из этих данных.

Я мог бы также сгенерировать данные на стороне Java и передать их в c ++ и сгенерировать оттуда данные для гобоя. Приложение работает не в реальном времени, но я бы хотел избежать задержек.

В настоящее время я использую Set * ArrayRegion () для передачи данных в Java, но это копирует данные. Мне действительно нужна только ссылка на массив для доступа для чтения к данным. Может ли NewDirectByteBuffer () дать мне такой доступ? Мне нужно получить доступ к данным, чтобы вывести их на экран, а затем я могу отказаться от ссылки. Будет ли это работать или мне нужно будет скопировать массив? Массивы могут содержать от нескольких тысяч до более 100 тысяч элементов. 1000-100000 элементов, вероятно, будут средними. Меня беспокоит производительность.

Будет ли передача данных в c ++ с помощью Get * ArrayElements () быстрее? Do c говорит, что может копировать. Я мог бы передать данные в c ++ и сгенерировать из него данные гобоя.

Похоже, что если я не использую NewDirectByteBuffer (), я получу две копии данных. Будет ли это работать, а если нет, будет ли Java для c ++ или c ++ для Java быстрее?

1 Ответ

0 голосов
/ 13 июля 2020

Прежде всего, измерьте, можете ли вы жить с копией (с помощью Set * ArrayRegion). Это, безусловно, самая простая архитектура.

Если вы не можете, прямой байтовый буфер, совместно используемый Java и C ++, действительно был бы оптимальным решением. Имейте в виду, что создание прямого байтового буфера потенциально дорого, поэтому старайтесь повторно использовать байтовые буферы (ie поддерживать пул) вместо создания новых.

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