이 페이지에서는 NDK에 포함된 라이브러리에 관한 개요와 NDK API 참조의 관련 요소 및 라이브러리 위치 가이드의 링크를 제공합니다.
네이티브 API 사용
다음 두 단계를 통해 NDK에서 제공하는 라이브러리를 사용할 수 있습니다.
라이브러리에 연결하도록 빌드 시스템에 지시합니다.
ndk-build 사용 시: Android.mk의
LOCAL_LDLIBS
에 라이브러리를 추가합니다. 선행lib
를 제거하고 대신-l
을 추가합니다. 예를 들어libfoo
및libbar
에 연결하려면 다음과 같이 작성합니다.makefile LOCAL_LDLIBS := -lfoo -lbar
LOCAL_LDLIBS
에 관한 자세한 내용은 Android.mk 문서를 참조하세요.CMake 사용 시: 스튜디오의 NDK API 추가 문서에 있는 안내에 따릅니다.
코드의 적절한 헤더를
#include
합니다.
Core C/C++
C 라이브러리
<stdlib.h>
및 <stdio.h>
와 같은 표준 C11 라이브러리 헤더는 기존과 마찬가지로 사용할 수 있습니다.
Android에서는 Linux와 달리 별도의 libpthread
또는 librt
라이브러리가 없습니다. 이 기능은 libc
에 직접 포함되어 있으므로 명시적으로 연결하지 않아도 됩니다.
수학 함수를 위한 별도의 libm
이 있는데(일반적인 Unix 전통을 따름), 이는 libc
처럼 빌드 시스템에 의해 자동으로 연결됩니다.
dlopen(3) 및 dlsym(3)과 같은 <dlfcn.h>
의 동적 링커 기능을 사용할 수 있지만 명시적으로 libdl
에 연결해야 합니다.
라이브러리: libc
/libm
/libdl
C++ 라이브러리
C++17 지원을 사용할 수 있습니다. C++ 라이브러리 지원에 관한 자세한 내용은 C++ 라이브러리 지원을 참고하세요.
로깅
<android/log.h>
에는 logcat에 로깅하기 위한 API가 포함되어 있습니다.
API 수준 3부터 사용할 수 있습니다.
라이브러리: liblog
참조: 로깅
트레이스
네이티브 추적 API <android/trace.h>
는 자바 프로그래밍 언어의 android.os.Trace
클래스에 상응하는 네이티브 API를 제공합니다. 이 API를 사용하면 시스템 트레이스 버퍼에 트레이스 이벤트를 작성하여 코드에서 이름이 지정된 작업 단위를 추적할 수 있습니다. 그러면 Systrace 도구를 사용하여 트레이스 이벤트를 수집하고 분석할 수 있습니다.
API 수준 23부터 사용할 수 있습니다.
라이브러리: libandroid
가이드: 네이티브 추적
zlib 압축
<zlib.h>
를 포함하고 libz
에 연결하여 Zlib 압축 라이브러리를 사용할 수 있습니다.
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을 지원합니다.
필수 GPU가 있는 Android 기기만 이후 버전의 OpenGL ES를 완벽하게 지원하지만 라이브러리는 API 수준(라이브러리가 도입된)을 지원하는 모든 기기에 있습니다. 라이브러리에 연결하는 것이 안전하지만 앱은 OpenGL ES 버전 문자열 및 확장 문자열을 쿼리하여 현재 기기가 앱에 필요한 기능을 지원하는지 확인해야 합니다. 이 쿼리를 실행하는 방법에 관한 자세한 내용은 OpenGL 사양의 glGetString()
설명을 참조하세요.
또한 매니페스트 파일에 <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
Vulkan은 고성능 3D 그래픽 렌더링을 위한 오버헤드가 낮은 크로스 플랫폼 API입니다. Vulkan은 Khronos Group에서 유지 관리하는 개방형 표준입니다. 표준 <vulkan/vulkan.h>
헤더 파일에는 코드에서 Vulkan 렌더링 호출을 실행하는 데 필요한 선언이 포함되어 있습니다.
코드 샘플은 GitHub의 LunarG VulkanSamples 및 android-vulkan-tutorials 프로젝트를 참조하세요.
Vulkan 라이브러리는 API 수준 24 이상을 지원하는 모든 기기에 있지만 앱에서 런타임 시 필수 GPU 하드웨어 지원이 제공되는지 확인해야 합니다. Vulkan을 지원하지 않는 기기는 vkEnumeratePhysicalDevices
에서 0개의 기기를 반환합니다.
API 수준 24부터 사용할 수 있습니다.
라이브러리: libvulkan
가이드: Vulkan 그래픽 API 가이드
비트맵
libjnigraphics
라이브러리는 자바 Bitmap
객체의 픽셀 버퍼에 액세스할 수 있게 해주는 API를 제공합니다. 워크플로는 다음과 같습니다.
AndroidBitmap_getInfo()
를 호출하여 특정 비트맵 핸들에 관한 정보(예: 너비 및 높이)를 가져옵니다.AndroidBitmap_lockPixels()
를 호출하여 픽셀 버퍼를 잠그고 픽셀 버퍼의 포인터를 가져옵니다. 이렇게 하면 앱이AndroidBitmap_unlockPixels()
를 호출할 때까지 픽셀이 움직이지 않습니다.픽셀 버퍼를 픽셀 형식, 너비 및 기타 특성에 맞게 수정합니다.
AndroidBitmap_unlockPixels()
를 호출하여 버퍼의 잠금을 해제합니다.
API 수준 8부터 사용할 수 있습니다.
라이브러리: libjnigraphics
참조: Bitmap API 참조
Sync API
API 수준 26부터 사용할 수 있습니다.
라이브러리: libsync
참조: Sync API 참조
카메라
네이티브 Camera API를 통해 세분화된 사진 캡처 및 처리를 실행할 수 있습니다. 자바 camera2 API와는 달리 네이티브 카메라 API는 지원 중단된 카메라 HAL 1.0 구현을 지원하지 않습니다. 즉, 네이티브 카메라 API에서 사용할 수 있는 카메라 목록에는 레거시 하드웨어 수준의 카메라 기기가 나열되지 않습니다.
API 수준 24부터 사용할 수 있습니다.
라이브러리: libcamera2ndk
참조: Camera API 참조
미디어
libmediandk
Media API는 MediaExtractor
, MediaCodec
및 기타 관련 자바 API와 유사한 하위 수준의 네이티브 인터페이스를 제공합니다.
라이브러리: libmediandk
참조: Media API 참조
OpenMAX AL
Android 네이티브 멀티미디어 처리는 Khronos Group OpenMAX AL 1.0.1 API를 기반으로 합니다.
표준 OpenMAX AL 헤더 <OMXAL/OpenMAXAL.h>
및 <OMXAL/OpenMAXAL_Platform.h>
에는 Android의 네이티브 측에서 멀티미디어 출력을 실행하는 데 필요한 선언이 포함되어 있습니다.
또한 OpenMAX AL의 NDK 배포는 Android 관련 확장도 제공합니다.
이러한 확장에 관한 자세한 내용은 <OMXAL/OpenMAXAL_Android.h>
의 설명을 참조하세요.
API 수준 14부터 사용할 수 있습니다.
라이브러리: libOpenMAXAL
Android 네이티브 애플리케이션 API
자세한 내용은 Android NDK API 참조 문서를 확인하세요.
API에는 다음이 포함됩니다.
라이브러리: libandroid
라이브러리: 최신 네이티브 창 기능을 위한 libnativewindow
전체 참조: Android NDK API 참조
하드웨어 버퍼 API
프로세스 간 버퍼 관리를 위해 자체 파이프라인을 만드는 데 사용할 수 있는 네이티브 API가 2개 있습니다.
네이티브 하드웨어 버퍼 API <android/hardware_buffer.h>
를 사용하면 직접 버퍼를 할당하여 프로세스 간 버퍼 관리를 위한 자체 파이프라인을 만들 수 있습니다.
AHardwareBuffer
를 할당하고 사용하면 eglGetNativeClientBufferANDROID
확장을 통해 EGLClientBuffer
리소스 유형을 얻을 수 있습니다. 이 버퍼를 eglCreateImageKHR
에 전달하여 EGLImage
리소스 유형을 생성하면 지원되는 기기에서 glEGLImageTargetTexture2DOES
를 통해 이 리소스 유형을 텍스처에 결합할 수 있습니다. 이 방법은 프로세스 간에 공유할 수 있는 텍스처를 생성하는 데 유용할 수 있습니다.
네이티브 하드웨어 버퍼 JNI API(<android/hardware_buffer_jni.h>
)를 사용하면 HardwareBuffer
객체를 얻을 수 있으며 이 객체는 Parcelable이므로 서로 다른 두 프로세스 간에 전송될 수 있습니다. 이런 방법으로 앱은 내부 Android API에 액세스하지 않고도 SurfaceFlinger와 유사한 기능(예: 프로세스 사이에 자체 버퍼 대기열 생성)을 사용할 수 있습니다.
오디오
AAudio
AAudio는 현재 지원되는 네이티브 오디오 API로, OpenSL ES를 대체했으며 지연 시간이 짧은 오디오가 필요한 고성능 오디오 앱을 더 효과적으로 지원합니다.
API 수준 26부터 사용할 수 있습니다.
라이브러리: libaaudio
가이드: AAudio API 가이드
참조: AAudio API 참조
OpenSL ES
OpenSL ES는 지원되는 또 다른 네이티브 오디오 API입니다. 아래 가이드의 관련 내용을 참조하세요.
API 수준 9부터 사용할 수 있습니다. API 수준 14에서는 PCM 지원을 추가했습니다.
라이브러리: libOpenSLES
Neural Networks API
Neural Networks API(NNAPI)는 기기 내 머신러닝 작업을 위한 하드웨어 가속 기능을 앱에 제공합니다. 이 API는 기기 내 모델 생성, 컴파일 및 실행을 지원합니다. 일반적으로 앱은 NNAPI를 직접 사용하지 않습니다. 대신 이 API는 머신러닝 라이브러리, 프레임워크 및 도구에 의해 호출되며 개발자는 이들을 통해 모델을 학습시키고 Android 기기에 배포할 수 있습니다.
API 수준 27부터 사용할 수 있습니다.
라이브러리: libneuralnetworks
가이드: Neural Networks 가이드