Затраты на использование JNI на Android - PullRequest
0 голосов
/ 12 мая 2011

Я пишу приложение (на Android), которое использует как Java-код, так и нативный код.Время от времени, звук должен быть воспроизведен.К сожалению, нативный код не имеет API (или, по крайней мере, стабильных / официальных) для аудио, но только он знает, когда нужно воспроизвести звук.Я придумал два способа сделать это:

  1. Есть функция, которая отслеживает (в очереди или еще много чего) звуки, которые необходимо воспроизвести.Когда вызвано, это возвратит строку, дающую название звука, который должен быть воспроизведен.Таким образом, Java-код может вызывать эту функцию, пока не получит пустую строку, в которой воспроизводится звук.

  2. Возвращает массив строк звуков, которые необходимо воспроизвести, илипустой массив, если его нет.

Но потом я понял, что вызовы JNI стоят дорого.И для этого все еще требуется, чтобы код Java вызывал функцию каждую итерацию или около того, чтобы убедиться, что она играет правильно.И особенно плохо для # 1, так как он должен был бы вызывать каждый оставшийся звук для воспроизведения, хотя и не намного хуже, чем я мог бы себе представить.

Итак, звонки JNI слишком дороги, чтобы сделать это неосуществимым?Если нативный код каким-то образом информирует java-код о том, что звуки нужно воспроизводить без предварительного запроса java-кода (таким образом, выполняется меньше вызовов JNI).Однако я заметил, что код отрисовки в примере Android OpenGLES ES 2 ndk прошел через JNI, и это казалось нормальным, но опять же, он нарисовал только треугольник и фон.

ЯЯ не уверен, как мне будет это профилировать, кроме как сделать оба и посмотреть, что работает лучше, поэтому я был бы очень признателен за ваш вклад.Большое спасибо.

1 Ответ

4 голосов
/ 12 мая 2011

Ознакомьтесь с примером NDK из Tegra Resources .

Примеры приложений и документации Android SDK и NDK (NV_EVENT, акселерометр, аудио, производительность JNI, OpenGL ES 2.0и мультитач)

Включает пример JNI Audio, который вы хотите реализовать.Образец OpenGL ES 2.0 и тестовый код JNI Performance также включены.

(Кроме того, аудио-API OpenSL ES для NDK доступен с Android 2.3.)

...