기본 API

이 페이지에서는 NDK에 포함된 라이브러리에 관한 개요와 NDK API 참조의 관련 요소 및 라이브러리 위치 가이드의 링크를 제공합니다.

네이티브 API 사용

다음 두 단계를 통해 NDK에서 제공하는 라이브러리를 사용할 수 있습니다.

  1. 라이브러리에 연결하도록 빌드 시스템에 지시합니다.

    • ndk-build 사용 시: Android.mkLOCAL_LDLIBS에 라이브러리를 추가합니다. 선행 lib를 제거하고 대신 -l을 추가합니다. 예를 들어 libfoolibbar에 연결하려면 다음과 같이 작성합니다. makefile LOCAL_LDLIBS := -lfoo -lbar

      LOCAL_LDLIBS에 관한 자세한 내용은 Android.mk 문서를 참조하세요.

    • CMake 사용 시: 스튜디오의 NDK API 추가 문서에 있는 안내에 따릅니다.

  2. 코드의 적절한 헤더를 #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_bufferANDROID_front_buffer_auto_refresh 확장 지원을 추가했습니다.

API 수준 9부터 사용할 수 있습니다.

라이브러리: libEGL

가이드: EGL 네이티브 플랫폼 인터페이스

Vulkan

Vulkan은 고성능 3D 그래픽 렌더링을 위한 오버헤드가 낮은 크로스 플랫폼 API입니다. Vulkan은 Khronos Group에서 유지 관리하는 개방형 표준입니다. 표준 <vulkan/vulkan.h> 헤더 파일에는 코드에서 Vulkan 렌더링 호출을 실행하는 데 필요한 선언이 포함되어 있습니다.

코드 샘플은 GitHub의 LunarG VulkanSamplesandroid-vulkan-tutorials 프로젝트를 참조하세요.

Vulkan 라이브러리는 API 수준 24 이상을 지원하는 모든 기기에 있지만 앱에서 런타임 시 필수 GPU 하드웨어 지원이 제공되는지 확인해야 합니다. Vulkan을 지원하지 않는 기기는 vkEnumeratePhysicalDevices에서 0개의 기기를 반환합니다.

API 수준 24부터 사용할 수 있습니다.

라이브러리: libvulkan

가이드: Vulkan 그래픽 API 가이드

비트맵

libjnigraphics 라이브러리는 자바 Bitmap 객체의 픽셀 버퍼에 액세스할 수 있게 해주는 API를 제공합니다. 워크플로는 다음과 같습니다.

  1. AndroidBitmap_getInfo()를 호출하여 특정 비트맵 핸들에 관한 정보(예: 너비 및 높이)를 가져옵니다.

  2. AndroidBitmap_lockPixels()를 호출하여 픽셀 버퍼를 잠그고 픽셀 버퍼의 포인터를 가져옵니다. 이렇게 하면 앱이 AndroidBitmap_unlockPixels()를 호출할 때까지 픽셀이 움직이지 않습니다.

  3. 픽셀 버퍼를 픽셀 형식, 너비 및 기타 특성에 맞게 수정합니다.

  4. 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

가이드: Android용 OpenSL ES 가이드

Neural Networks API

Neural Networks API(NNAPI)는 기기 내 머신러닝 작업을 위한 하드웨어 가속 기능을 앱에 제공합니다. 이 API는 기기 내 모델 생성, 컴파일 및 실행을 지원합니다. 일반적으로 앱은 NNAPI를 직접 사용하지 않습니다. 대신 이 API는 머신러닝 라이브러리, 프레임워크 및 도구에 의해 호출되며 개발자는 이들을 통해 모델을 학습시키고 Android 기기에 배포할 수 있습니다.

API 수준 27부터 사용할 수 있습니다.

라이브러리: libneuralnetworks

가이드: Neural Networks 가이드

참조: Neural Networks API 참조