네이티브 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합니다.

애플리케이션의 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_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 참조