Android: наиболее эффективный способ передачи байтов только для чтения на собственный C ++ - PullRequest
5 голосов
/ 16 декабря 2011

У меня есть проект Android (нацеленный на Android 1.6 и выше), который включает нативный код, написанный на C / C ++, доступ к которому осуществляется через NDK. Мне интересно, какой самый эффективный способ - передать массив байтов из Java через NDK в мой слой клея JNI. Меня беспокоит вопрос, скопирует ли NDK для Android массив байтов или просто даст мне прямую ссылку. Мне нужен доступ только для чтения к байтам на уровне C ++, поэтому любое копирование за кулисами было бы пустой тратой времени с моей точки зрения.

Легко найти информацию об этом в Интернете, но я не уверен, что это самая важная информация. Примеры:

Получить указатель Java ByteBuffer через JNI

http://www.milk.com/kodebase/dalvik-docs-mirror/docs/jni-tips.html

http://elliotth.blogspot.com/2007/03/optimizing-jni-array-access.html

Так кто-нибудь знает, каков наилучший (самый эффективный, наименее копирующий) способ сделать это в текущем NDK? GetByteArrayRegion? GetByteArrayElements? Что-то еще?

1 Ответ

5 голосов
/ 16 декабря 2011

Согласно документации, GetDirectBufferAddress даст вам ссылку без копирования массива.

Однако для вызова этой функции вам нужно выделить прямой буфер с ByteBuffer.allocateDirect () вместо простого байтового массива.У него есть аналог, как объяснено здесь :

Прямой байтовый буфер может быть создан путем вызова фабричного метода allocateDirect этого класса.Буферы, возвращаемые этим методом, обычно имеют несколько более высокие затраты на выделение и освобождение, чем непрямые буферы.Содержимое прямых буферов может находиться за пределами обычной кучи сбора мусора, поэтому их влияние на объем памяти приложения может быть неочевидным.Поэтому рекомендуется, чтобы прямые буферы были выделены в первую очередь для больших долговечных буферов, которые подчиняются собственным операциям ввода-вывода базовой системы.В общем случае лучше всего размещать прямые буферы только тогда, когда они дают ощутимый прирост производительности программы.

...