На этой странице представлен обзор библиотек, входящих в состав NDK, со ссылками на соответствующие части справочника API NDK и на руководства, где они существуют.
Используйте собственные API
Использование библиотеки, предоставляемой NDK, состоит из двух шагов:
Дайте команду системе сборки скомпоновать ее с библиотекой.
Если вы используете ndk-build : добавьте библиотеку в
LOCAL_LDLIBS
в вашем Android.mk . Обратите внимание, что вы удаляете начальнуюlib
и вместо неё указываете-l
. Например, для компоновки сlibfoo
иlibbar
нужно написать:makefile LOCAL_LDLIBS := -lfoo -lbar
Дополнительную информацию о
LOCAL_LDLIBS
см. в документации Android.mk .Если вы используете CMake : следуйте инструкциям в документации Studio Add NDK APIs .
#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
. Рабочий процесс выглядит следующим образом:
Вызовите
AndroidBitmap_getInfo()
, чтобы получить информацию, такую как ширина и высота, о заданном дескрипторе растрового изображения.Вызовите
AndroidBitmap_lockPixels()
, чтобы заблокировать буфер пикселей и получить указатель на него. Это гарантирует, что пиксели не будут перемещаться, пока приложение не вызоветAndroidBitmap_unlockPixels()
.Измените пиксельный буфер в соответствии с его форматом пикселей, шириной и другими характеристиками.
Вызовите
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 включают в себя:
- Объект
- Хореограф
- Конфигурация
- Вход
- Лупер
- Родная активность
- Собственные аппаратные буферы
- Собственное окно
- Память
- Нетворкинг
- Датчик
- Хранилище
- SurfaceTexture
Библиотека: 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 нейронных сетей