이 페이지에서는 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
합니다.
애플리케이션의 minSdkVersion
보다 최신인 API는 기본적으로 호출할 수 없으며 대신 dlopen()
및 dlsym()
를 통해 사용해야 합니다.
더 쉬운 접근 방법은 최신 API 사용을 참고하세요.
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 압축 라이브러리를 사용할 수 있습니다.
NDK에는 항상 출시 시점에 최신 zlib 헤더 파일이 포함되며 정적 연결을 위해 NDK에 포함된 libz.a
는 항상 동일한 해당 버전이지만 동적 연결을 위한 libz.so
는 출처가 기기이며 해당 기기에 출시되는 버전입니다. 특히, 이는 빌드한 헤더가 기기의 zlib 버전과 일치하지 않는다는 것을 의미합니다. 따라서 구현 세부정보를 가정하는 것에 대한 일반적인 경고가 여기에서 특히 유효합니다. Google에서는 공개 API와 관련된 어떠한 문제도 알지 못하지만, 특히 구조체 레이아웃은 시간이 지남에 따라 변경되었으며 계속 변경될 가능성이 높습니다. 이후 zlib 버전의 새 API는 이 API 이전의 OS 버전에서는 사용할 수 없습니다. 항상 libz.so
대신 정적 libz.a
를 사용하여 이러한 모든 문제를 방지할 수 있습니다(APK 크기가 늘어나는 단점은 있음).
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 가이드