Собственные API

На этой странице представлен обзор библиотек, входящих в состав NDK, со ссылками на соответствующие части справочника API NDK и на руководства, где они существуют.

Используйте собственные API

Использование библиотеки, предоставляемой NDK, состоит из двух шагов:

  1. Дайте команду системе сборки скомпоновать ее с библиотекой.

    • Если вы используете ndk-build : добавьте библиотеку в LOCAL_LDLIBS в вашем Android.mk . Обратите внимание, что вы удаляете начальную lib и вместо неё указываете -l . Например, для компоновки с libfoo и libbar нужно написать: makefile LOCAL_LDLIBS := -lfoo -lbar

      Дополнительную информацию о LOCAL_LDLIBS см. в документации Android.mk .

    • Если вы используете CMake : следуйте инструкциям в документации Studio Add NDK APIs .

  2. #include соответствующие заголовки из вашего кода.

Обратите внимание, что API, версии которых ниже minSdkVersion вашего приложения, не будут доступны по умолчанию, и вместо этого их необходимо использовать через dlopen() и dlsym() . Более простой подход см. в разделе Использование новых API .

Ядро C/C++

библиотека C

Стандартные заголовочные файлы библиотеки C11, такие как <stdlib.h> и <stdio.h> доступны в обычном режиме.

Обратите внимание, что в Android, в отличие от Linux, нет отдельных библиотек libpthread и librt . Эта функциональность включена непосредственно в libc , и её не нужно явно подключать.

Для математических функций существует отдельная libm (следуя обычной традиции Unix), но, как и libc , она автоматически скомпонована системами сборки.

Функциональность динамического компоновщика в <dlfcn.h> такая как dlopen(3) и dlsym(3), доступна, но необходимо явно выполнить ссылку на libdl .

Библиотека: libc / libm / libdl

библиотека C++

Доступна поддержка C++17. Подробнее о поддержке библиотеки C++ см. в разделе «Поддержка библиотеки C++» .

Ведение журнала

<android/log.h> содержит API для ведения журнала в logcat.

Доступно с уровня API 3.

Библиотека: liblog

Ссылка: Ведение журнала

След

Нативное API трассировки <android/trace.h> предоставляет нативный эквивалент класса android.os.Trace в языке программирования Java. Этот API позволяет трассировать именованные единицы работы в коде, записывая события трассировки в системный буфер трассировки. Затем вы можете собирать и анализировать события трассировки с помощью инструмента Systrace .

Доступно с уровня API 23.

Библиотека: libandroid

Руководство: Собственная трассировка

сжатие zlib

Вы можете использовать библиотеку сжатия Zlib , включив <zlib.h> и скомпоновав ее с libz .

NDK всегда включает в себя последние заголовочные файлы zlib на момент выпуска, а libz.a , включенный в NDK для статической линковки, всегда той же версии, но libz.so для динамической линковки берется с устройства и может быть любой версией, выпущенной на этом устройстве. В частности, это означает, что заголовочные файлы, которые вы скомпоновали, не соответствуют версии zlib на устройстве, поэтому обычные предупреждения о недопустимости предположений о деталях реализации здесь особенно актуальны. Нам неизвестно о каких-либо проблемах с публичным API, но структура макета, в частности, менялась со временем и, вероятно, продолжит меняться. Обратите внимание, что новый API в более поздних версиях zlib, очевидно, не будет доступен в версиях ОС, предшествующих API. Можно избежать всех этих проблем (ценой увеличения размера APK), всегда используя статический libz.a вместо libz.so .

Доступно с API уровня 3 (но см. примечание выше).

Библиотека: libz

Графика

OpenGL ES 1.0 - 3.2

Стандартные заголовочные файлы OpenGL ES 1.x ( <GLES/gl.h> и <GLES/glext.h> ), заголовочные файлы 2.0 ( <GLES2/gl2.h> и <GLES2/gl2ext.h> ), заголовочные файлы 3.0 ( <GLES3/gl3.h> и <GLES3/gl3ext.h> ), заголовочные файлы 3.1 ( <GLES3/gl31.h> и <GLES3/gl3ext.h> ) и заголовочные файлы 3.2 ( <GLES3/gl32.h> и <GLES3/gl3ext.h> ) содержат объявления, необходимые для OpenGL ES.

Чтобы использовать OpenGL ES 1.x, подключите свой собственный модуль к libGLESv1_CM .

Чтобы использовать OpenGL ES 2.0, подключите свой собственный модуль к libGLESv2 .

Чтобы использовать OpenGL ES 3.x, подключите свой собственный модуль к libGLESv3 .

Все устройства на базе Android поддерживают OpenGL ES 1.0 и 2.0.

Только устройства Android с необходимым графическим процессором полностью поддерживают более поздние версии OpenGL ES, но библиотеки присутствуют на всех устройствах, поддерживающих тот уровень API, на котором они были представлены. Библиотеки можно подключать безопасно, но приложение должно запросить строку версии OpenGL ES и строку расширения, чтобы определить, поддерживает ли текущее устройство необходимые функции. Информация о том, как выполнить этот запрос, приведена в описании функции glGetString() в спецификации OpenGL.

Кроме того, необходимо поместить тег <uses-feature> в файл манифеста, чтобы указать требуемую версию OpenGL ES .

OpenGL ES 1.0 доступен начиная с API уровня 4.

OpenGL ES 2.0 доступен начиная с API уровня 5.

OpenGL ES 3.0 доступен начиная с уровня API 18.

OpenGL ES 3.1 доступен начиная с API уровня 21.

OpenGL ES 3.2 доступен начиная с API уровня 24.

EGL

EGL предоставляет собственный интерфейс платформы через заголовочные файлы <EGL/egl.h> и <EGL/eglext.h> для выделения и управления контекстами и поверхностями OpenGL ES.

EGL позволяет выполнять следующие операции из собственного кода:

  • Список поддерживаемых конфигураций EGL.
  • Выделение и освобождение поверхностей OpenGL ES.
  • Создание и уничтожение контекстов OpenGL ES.
  • Поменяйте или переверните поверхности.

В API уровня 24 добавлена ​​поддержка расширений EGL_KHR_mutable_render_buffer , ANDROID_create_native_client_buffer и ANDROID_front_buffer_auto_refresh .

Доступно с уровня API 9.

Библиотека: libEGL

Руководство: Интерфейс собственной платформы EGL

Вулкан

Vulkan — это кроссплатформенный API с низкими издержками для высокопроизводительного рендеринга 3D-графики. Vulkan — открытый стандарт, поддерживаемый Khronos Group. Стандартный заголовочный файл <vulkan/vulkan.h> содержит объявления, необходимые для выполнения вызовов рендеринга Vulkan из вашего кода.

Примеры кода см. в проектах LunarG VulkanSamples и android-vulkan-tutorials на GitHub.

Библиотека Vulkan присутствует на всех устройствах, поддерживающих API уровня 24 или выше, но приложения должны проверять во время выполнения наличие необходимой аппаратной поддержки графического процессора. Устройства без поддержки Vulkan вернут ноль устройств из vkEnumeratePhysicalDevices .

Доступно с уровня API 24.

Библиотека: libvulkan

Руководство: Руководство по графическому API Vulkan

Растровые изображения

Библиотека libjnigraphics предоставляет API, позволяющий получить доступ к пиксельным буферам объектов Java Bitmap . Рабочий процесс выглядит следующим образом:

  1. Вызовите AndroidBitmap_getInfo() , чтобы получить информацию, такую ​​как ширина и высота, о заданном дескрипторе растрового изображения.

  2. Вызовите AndroidBitmap_lockPixels() , чтобы заблокировать буфер пикселей и получить указатель на него. Это гарантирует, что пиксели не будут перемещаться, пока приложение не вызовет AndroidBitmap_unlockPixels() .

  3. Измените пиксельный буфер в соответствии с его форматом пикселей, шириной и другими характеристиками.

  4. Вызовите AndroidBitmap_unlockPixels() чтобы разблокировать буфер.

Доступно с уровня API 8.

Библиотека: libjnigraphics

Ссылка: Справочник API Bitmap

API синхронизации

Доступно с уровня API 26.

Библиотека: libsync

Ссылка: Справочник по API синхронизации

Камера

Собственные API камеры обеспечивают детальную съёмку и обработку фотографий. В отличие от API камеры Java2, собственный API камеры не поддерживает устаревшие реализации HAL 1.0 (то есть в списке доступных камер в собственном API камеры не будут указаны камеры с аппаратным уровнем LEGACY ).

Доступно с уровня API 24.

Библиотека: libcamera2ndk

Ссылка: Справочник API камеры

СМИ

libmediandk

Интерфейсы Media API предоставляют низкоуровневые собственные интерфейсы, аналогичные MediaExtractor , MediaCodec и другим связанным API Java.

Библиотека: libmediandk

Ссылка: Справочник по API медиа

OpenMAX AL

Собственная обработка мультимедиа в Android основана на API Khronos Group OpenMAX AL 1.0.1.

Стандартные заголовочные файлы OpenMAX AL <OMXAL/OpenMAXAL.h> и <OMXAL/OpenMAXAL_Platform.h> содержат объявления, необходимые для выполнения вывода мультимедиа с собственной стороны Android.

Дистрибутив NDK OpenMAX AL также предоставляет расширения, специфичные для Android. Подробнее об этих расширениях см. в комментариях к файлу <OMXAL/OpenMAXAL_Android.h> .

Доступно с уровня API 14.

Библиотека: libOpenMAXAL

API-интерфейсы собственных приложений Android

Более подробную информацию см. в справочной документации по API Android NDK .

API включают в себя:

Библиотека: libandroid

Библиотека: libnativewindow для более современной функциональности Native Window

Полная ссылка: Справочник по API Android NDK

API-интерфейсы Binder

API Binder позволяют создавать каналы связи между процессами. Это низкоуровневая реализация межпроцессного взаимодействия Android. По возможности отдавайте предпочтение компонентам более высокого уровня. Однако эта библиотека доступна для расширенных вариантов использования.

Библиотека: libbinder_ndk

Ссылка: Биндер

API аппаратного буфера

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

API аппаратного буфера <android/hardware_buffer.h> позволяет напрямую выделять буферы для создания собственных конвейеров для кросс-процессного управления буферами. Вы можете выделить буфер AHardwareBuffer и использовать его для получения типа ресурса EGLClientBuffer через расширение eglGetNativeClientBufferANDROID . Вы можете передать этот буфер в eglCreateImageKHR для создания типа ресурса EGLImage , который затем можно привязать к текстуре через glEGLImageTargetTexture2DOES на поддерживаемых устройствах. Это может быть полезно для создания текстур, которые могут совместно использоваться в разных процессах.

Собственный JNI-API аппаратного буфера ( <android/hardware_buffer_jni.h> ) позволяет получить объект HardwareBuffer , который является Parcelable и, следовательно, может передаваться между двумя различными процессами. Это предоставляет вашему приложению возможности, аналогичные SurfaceFlinger , например, возможность создавать собственную очередь буферов между процессами без доступа к внутренним API Android.

Аудио

AAudio

AAudio — это поддерживаемый в настоящее время нативный аудио API. Он пришёл на смену OpenSL ES и обеспечивает улучшенную поддержку высокопроизводительных аудиоприложений, которым требуется звук с низкой задержкой.

Доступно с уровня API 26.

Библиотека: libaaudio

Руководство: Руководство по API AAudio

Ссылка: Справочник API AAudio

OpenSL ES

OpenSL ES — еще один собственный аудио API, который также поддерживается, но см. примечание в руководстве ниже.

Доступно с уровня API 9. В API уровня 14 добавлена ​​поддержка PCM.

Библиотека: libOpenSLES

Руководство: Руководство по OpenSL ES для Android

API нейронных сетей

API нейронных сетей (NNAPI) предоставляет приложениям аппаратное ускорение для выполнения операций машинного обучения на устройствах. API поддерживает создание, компиляцию и выполнение моделей на устройствах. Приложения обычно не используют NNAPI напрямую; вместо этого API предназначен для вызова библиотеками, фреймворками и инструментами машинного обучения, которые позволяют разработчикам обучать свои модели и развертывать их на устройствах Android.

Доступно с уровня API 27.

Библиотека: libneuralnetworks

Руководство: Руководство по нейронным сетям

Ссылка: Справочник по API нейронных сетей