Android NDK 네이티브 API

Android NDK는 Android API 레벨이 연이어 새로 출시됨에 따라 점차 더 많은 네이티브 헤더와 공유 라이브러리 파일을 제공합니다. 이 페이지에서는 이러한 헤더와 파일을 설명하고 Android API 레벨별로 보여줍니다.

네이티브 API 사용

여러분의 앱이 NDK에서 제공되는 라이브러리를 사용하도록 설정하는 두 가지 기본 단계가 있습니다.

  1. 사용하려는 라이브러리와 연결된 헤더를 코드에 포함합니다.
  2. 로드 시점에 네이티브 모듈을 라이브러리에 링크를 걸어야 한다고 빌드 시스템에 지정합니다.
    • ndk-build를 사용하는 경우: Android.mk 파일에 있는 LOCAL_LDLIBS 변수에 네이티브 라이브러리를 추가합니다. 예를 들어 /system/lib/libfoo.so에 링크를 걸려면 다음 줄을 추가합니다.
    •     LOCAL_LDLIBS := -lfoo
          

      여러 라이브러리를 나열하려면 공백을 구분 기호로 사용합니다. LOCAL_LDLIBS 변수 사용에 대한 자세한 내용은 Android.mk를 참조하세요.

    • CMake를 사용하는 경우: C 및 C++ 코드를 프로젝트에 추가의 지침에 따릅니다.
모든 API 레벨에 대해 이 빌드 시스템은 자동으로 표준 C와 C++ 라이브러리를 링크합니다. LOCAL_LDLIBS를 설정하는 경우 명시적으로 라이브러리를 포함할 필요가 없습니다.

NDK는 종종 새 Android 릴리스를 위한 새로운 헤더와 라이브러리를 제공합니다. Android 릴리스 버전에 도입된 네이티브 API 목록은 아래 표 1을 참조합니다. 이 파일은 sysroot/usr/include 아래의 NDK 설치 루트에 있습니다.

다음 표는 NDK에서 지원되는 API 레벨과 Android 플랫폼 릴리스 간의 대응 관계를 보여줍니다. Android API 레벨에 대한 자세한 내용은 API 레벨이란?을 참조하세요.

표 1. Android 버전에서 도입한 주요 네이티브 API 지원 요약

NDK에서 지원되는 API 레벨 Android 플랫폼 릴리스 주요 네이티브 API 포함
3 1.5 C 표준 라이브러리(libc/libm) #include ...
C++ #include ...
자바 네이티브 인터페이스 #include <jni.h>
Android logging API #include <android/log.h>
Zlib #include <zlib.h>
동적 링커 #include <dlfcn.h>
4 1.6 OpenGL ES 1.x #include <GLES/gl.h>
#include <GLES/glext.h>
5 2.0 - 2.1.x OpenGL ES 2.0 #include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
8 2.2 Android bitmap API #include <android/bitmap.h>
9 2.3 - 3.0.x EGL #include <EGL/egl.h>
#include <EGL/eglext.h>
#include <EGL/eglplatform.h>
OpenSL ES #include <SLES/OpenSLES.h>
#include <SLES/OpenSLES_Platform.h>
#include <SLES/OpenSLES_Android.h>
#include <SLES/OpenSLES_AndroidConfiguration.h>
네이티브 애플리케이션 API 이벤트 루프:
#include <android/looper.h>

입력 이벤트:
#include <android/input.h>
#include <android/keycodes.h>

센서 이벤트:
#include <android/sensor.h>

Window/Surface 관리:
#include <android/rect.h>
#include <android/window.h>
#include <android/native_window.h>
#include <android/native_window_jni.h>

자산:
#include <android/asset_manager.h>

구성:
#include <android/configuration.h>

OBB 파일:
#include <android/storage_manager.h>

#include <android/obb.h>

네이티브 액티비티:
#include <android/native_activity.h>
12 3.1.x
13 3.2
14 4.0 - 4.0.2 OpenMAX AL #include <OMXAL/OpenMAXAL.h>
#include <OMXAL/OpenMAXAL_Platform.h>
#include <OMXAL/OpenMAXAL_Android.h>
15 4.0.3, 4.0.4
16 4.1, 4.1.1
17 4.2, 4.2.2
18 4.3 OpenGL ES 3.0 #include <GLES3/gl3.h>
#include <GLES3/gl3ext.h>
19 4.4, 4.4w
21 5.0, 5.1 OpenGL ES 3.1 #include <GLES3/gl31.h>
#include <GLES3/gl3ext.h>
네이티브 미디어 API #include <media/NdkMediaCodec.h>
#include <media/NdkMediaCrypto.h>
#include <media/NdkMediaDrm.h>
#include <media/NdkMediaError.h>
#include <media/NdkMediaExtractor.h>
#include <media/NdkMediaFormat.h>
#include <media/NdkMediaMuxer.h>
23 6.0 Native tracing API #include <android/trace.h>
24 7.0 - 7.1.1 Vulkan #include <vulkan/vulkan.h>
네이티브 카메라 API #include <camera/NdkCameraCaptureSession.h>
#include <camera/NdkCameraDevice.h>
#include <camera/NdkCameraError.h>
#include <camera/NdkCameraManager.h>
#include <camera/NdkCameraMetadata.h>
#include <camera/NdkCameraMetadataTags.h>
#include <camera/NdkCaptureRequest.h>
Native choreographer API #include <android/choreographer.h>
Native multinetwork API #include <android/multinetwork.h>
OpenGL ES 3.2 #include <GLES3/gl32.h>
#include <GLES3/gl3ext.h>
네이티브 미디어 API #include <media/NdkImage.h>
#include <media/NdkImageReader.h>
26 8.0 AAudio API #include <aaudio/AAudio.h>
하드웨어 버퍼 API #include <android/hardware_buffer.h>
#include <android/hardware_buffer_jni.h>>
Shared memory API #include <android/sharedmem.h>
27 8.1 Neural Networks API #include <android/NeuralNetworks.h>
Shared memory JNI API #include <android/hardware_buffer.h>
28 9.0 SurfaceTexture API #include <android/surface_texture.h>

네이티브 API 하이라이트

Android API 레벨 3

C 라이브러리

표준 C 라이브러리 헤더는 <stdlib.h><stdio.h>와 같은 평상시의 이름으로 사용할 수 있습니다. Android에서는 Linux와 다르게 별도의 pthread 및 rt 라이브러리가 없다는 점에 유념해야 합니다. 이 기능은 libc에 포함되어 있습니다. 수학 라이브러리는 libm에 별도로 존재하지만 컴파일러를 통해 자동으로 추가됩니다.

동적 링커 라이브러리

Android 동적 링커의 dlopen(3) 및 dlsym(3) 기능에 액세스할 수 있습니다. Libdl에도 반드시 링크를 걸어야 합니다. 예:
    LOCAL_LDLIBS := -ldl
    

C++ 라이브러리

C++17 지원을 이용할 수 있습니다. C++ 라이브러리 지원에 대한 자세한 내용은 C++ 라이브러리 지원을 참조하세요.

Android 고유의 로그 지원

<android/log.h>에는 앱이 네이티브 코드에서 logcat으로 로그 메시지를 보내는 데 사용할 수 있는 다양한 함수가 포함되어 있습니다. 이러한 정의에 대한 자세한 내용은 로그 기록 문서를 참조하세요. 보통 개발자가 나름의 래퍼 매크로를 작성해야 이 기능에 액세스할 수 있습니다. 로그를 기록하려면 liblog에 링크를 겁니다. 예:
    LOCAL_LDLIBS := -llog
    

ZLib 압축 라이브러리

zlib.hzconf.h를 포함하여 Zlib 압축 라이브러리를 사용할 수 있습니다. Android.mk 파일에 다음 줄을 포함하여 /system/lib/libz.so에 네이티브 모듈에도 링크를 걸어야 합니다.

    LOCAL_LDLIBS := -lz
    

Android API 레벨 4

NDK는 Android 1.6 시스템 이미지 이상에서 실행되는 네이티브 코드 개발을 위해 다음 API를 제공합니다.

OpenGL ES 1.x 라이브러리

표준 OpenGL ES 헤더 <GLES/gl.h><GLES/glext.h>에는 네이티브 코드에서 OpenGL ES 1.x 렌더링 호출을 수행하는 데 필요한 선언이 포함되어 있습니다.

이러한 헤더를 사용하려면 Android.mk 파일에 다음 줄을 포함하여 /system/lib/libGLESv1_CM.so에 네이티브 모듈 링크를 겁니다.

    LOCAL_LDLIBS := -lGLESv1_CM
    

Android는 GPU가 없는 기기에서 사용할 수 있는 Open GL 1.0 지원 소프트웨어 렌더기를 제공하므로 모든 Android 기반 기기는 OpenGL ES 1.0을 지원합니다.

필수 GPU가 있는 Android 기기만 OpenGL ES 1.1을 완벽하게 지원합니다. 앱은 OpenGL ES 버전 문자열과 확장 프로그램 문자열을 쿼리하여 현재 기기가 앱에 필요한 기능을 지원하는지 확인할 수 있습니다. 이 쿼리를 수행하는 방법에 대한 자세한 내용은 OpenGL 사양의 glGetString() 설명을 참조하세요.

또한 manifest 파일에 <uses-feature> 태그를 지정하여 애플리케이션에 필요한 OpenGL ES 버전을 표시해야 합니다.

EGL API는 API 레벨 9부터만 사용할 수 있습니다. 하지만 VM을 사용하면 EGL API에서 가져오는 작업 중에서 표면 만들기, 대칭 이동 등을 수행할 수 있습니다. GLSurfaceView 사용 방법에 대한 예는 GLSurfaceView 소개를 참조하세요.

san-angeles 샘플 애플리케이션은 네이티브 코드에서 각 프레임을 렌더링하여 이러한 작업을 수행하는 방법에 대한 예를 제공해줍니다. 이 샘플은 훌륭한 San Angeles Observation 데모 프로그램의 작은 Android 포트입니다.

Android API 레벨 5

NDK는 Android 2.0 시스템 이미지 이상에서 실행되는 네이티브 코드 개발을 위해 다음 API를 제공합니다.

OpenGL ES 2.0 라이브러리:

표준 OpenGL ES 2.0 헤더 <GLES2/gl2.h><GLES2/gl2ext.h>에는 네이티브 코드에서 OpenGL ES 2.0 렌더링 호출을 수행하는 데 필요한 선언이 포함되어 있습니다. 이러한 렌더링 호출을 통해 GLSL 언어를 사용하여 버텍스와 프래그먼트 셰이더를 정의하고 사용할 수 있습니다.

OpenGL ES 2.0을 사용하려면 Android.mk 파일에 다음 줄을 포함하여 /system/lib/libGLESv2.so에 네이티브 모듈 링크를 겁니다.

    LOCAL_LDLIBS := -lGLESv2
    

모든 기기가 OpenGL ES 2.0을 지원하는 것은 아닙니다. 앱은 OpenGL ES 버전 문자열과 확장 프로그램 문자열을 쿼리하여 현재 기기가 앱에 필요한 기능을 지원하는지 확인할 수 있습니다. 이 쿼리를 수행하는 방법에 대한 자세한 내용은 OpenGL 사양의 glGetString() 설명을 참조하세요.

또한 manifest 파일에 <uses-feature> 태그를 지정하여 애플리케이션에 필요한 OpenGL ES 버전을 표시해야 합니다. <uses-feature>의 OpenGL ES 설정에 대한 자세한 내용은 OpenGL ES를 참조하세요.

hello-gl2 샘플 애플리케이션은 NDK와 함께 OpenGL ES 2.0을 사용하는 방법에 대한 기본적인 예를 제공해줍니다.

EGL API는 API 레벨 9부터만 사용할 수 있습니다. 하지만 VM을 사용하면 EGL API에서 가져오는 작업 중에서 표면 만들기, 대칭 이동 등을 수행할 수 있습니다. GLSurfaceView 사용 방법에 대한 예는 GLSurfaceView 소개를 참조하세요.

Android API 레벨 8

NDK는 Android 2.2 시스템 이미지 이상에서 실행되는 네이티브 코드 개발을 위해 다음 API를 제공합니다.

jnigraphics

jnigraphics 라이브러리는 네이티브 코드가 자바 비트맵 객체의 픽셀 버퍼에 안정적으로 액세스할 수 있게 해주는 C 기반 인터페이스를 노출합니다. jnigraphics를 사용하기 위한 워크플로는 다음과 같습니다.

  1. AndroidBitmap_getInfo()를 사용하여 주어진 비트맵 핸들에 대해 너비 및 높이와 같은 정보를 JNI에서 가져옵니다.
  2. AndroidBitmap_lockPixels()를 사용하여 픽셀 버퍼를 잠그고 픽셀 버퍼에 대한 포인터를 가져옵니다. 이렇게 하면 앱이 AndroidBitmap_unlockPixels()를 호출할 때까지 픽셀이 움직이지 않습니다.
  3. 네이티브 코드에서 픽셀 형식, 너비 및 기타 특성에 맞춰 적절히 픽셀 버퍼를 수정합니다.
  4. AndroidBitmap_unlockPixels()를 호출하여 버퍼를 잠금 해제합니다.

jnigraphics를 사용하려면 소스 코드에 <bitmap.h> 헤더를 포함하고 Android.mk 파일에 다음 줄을 포함하여 jnigraphics에 링크를 겁니다.

    LOCAL_LDLIBS += -ljnigraphics
    

이 기능에 대한 추가적인 세부정보는 <android/bitmap.h> 파일의 주석에 있습니다.

Android API 레벨 9

NDK는 Android 2.3 시스템 이미지 이상에서 실행되는 네이티브 코드 개발을 위해 다음 API를 제공합니다.

EGL

EGL은 OpenGLES 표면의 할당 및 관리를 위한 네이티브 플랫폼 인터페이스를 제공합니다. 이 기능에 대한 자세한 내용은 EGL 네이티브 플랫폼 인터페이스를 참조하세요.

EGL을 사용하면 네이티브 코드에서 다음 작업을 수행할 수 있습니다.

  • 지원되는 EGL 구성의 나열
  • OpenGLES 표면 할당 및 해제
  • 표면 전환 또는 대칭 이동

다음 헤더는 EGL 기능을 제공합니다.

  • <EGL/egl.h>: 기본 EGL API 정의
  • <EGL/eglext.h>: EGL 확장 프로그램 관련 정의

시스템 EGL 라이브러리에 링크를 걸려면 Android.mk 파일에 다음 줄을 추가합니다.

    LOCAL_LDLIBS += -lEGL
    

OpenSL ES

Android 네이티브 오디오 처리는 Khronos Group OpenSL ES 1.0.1 API를 기반으로 합니다.

표준 OpenSL ES 헤더 <SLES/OpenSLES.h><SLES/OpenSLES_Platform.h>에는 Android의 네이티브측에서 오디오 입력과 출력을 수행하는 데 필요한 선언이 포함되어 있습니다. 또한, OpenSL ES의 NDK 배포는 Android 고유의 확장 프로그램을 제공합니다. 이러한 확장 프로그램에 대한 자세한 내용은 <SLES/OpenSLES_Android.h><SLES/OpenSLES_AndroidConfiguration.h>의 주석을 참조하세요.

시스템 라이브러리 libOpenSLES.so는 공개 네이티브 오디오 기능을 구현합니다. Android.mk 파일에 다음 줄을 추가하여 libOpenSLES.so에 링크를 거세요.

    LOCAL_LDLIBS += -lOpenSLES
    

OpenSL ES API에 대한 자세한 내용은 Android용 OpenSL ES를 참조하세요.

Android 네이티브 애플리케이션 API

API 레벨 9부터는 자바를 전혀 사용하지 않고 네이티브 코드로 전체 Android 앱을 작성할 수 있습니다.

참고: 앱을 네이티브 코드로 작성하는 것만으로는 VM에서 앱을 실행하기에 충분치 않습니다. 더욱이, 앱은 여전히 JNI를 통해 Android 플랫폼에서 제공하는 대부분의 기능에 액세스해야 합니다.

이 릴리스에서는 다음의 네이티브 헤더를 제공합니다.

이러한 헤더에 대한 자세한 내용은 NDK API 참조 문서와 헤더 내의 주석을 참조하세요. 또한, 네이티브 앱을 작성하는 더 큰 주제에 대한 자세한 내용은 네이티브 액티비티 및 애플리케이션을 참조하세요.

이러한 헤더를 하나 이상 포함하는 경우 libandroid.so 라이브러리에도 링크를 걸어야 합니다. libandroid.so에 링크를 걸려면 Android.mk 파일에 다음 줄을 포함합니다.

    LOCAL_LDLIBS += -landroid
    

Android API 레벨 14

NDK는 Android 4.0 시스템 이미지 이상에서 실행되는 네이티브 코드 개발을 위해 다음 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>의 주석을 참조하세요.

시스템 라이브러리 libOpenMAXAL.so는 공개 네이티브 멀티미디어 기능을 구현합니다. 이 라이브러리에 링크를 걸려면 Android.mk 파일에 다음 줄을 포함합니다.

    LOCAL_LDLIBS += -lOpenMAXAL
    

이 주제에 대한 자세한 내용은 $NDK/docs/openmaxal/index.html을 참조하세요. 여기서 $NDK는 NDK 설치 루트 디렉토리입니다.

OpenSL ES

이 Android API 레벨에 대한 OpenSL ES 지원에 PCM 지원을 추가합니다. NDK의 OpenSL ES 지원에 대한 자세한 내용은 OpenSL ES를 참조하세요.

Android API 레벨 18

NDK는 Android 4.3 시스템 이미지 이상에서 실행되는 네이티브 코드 개발을 위해 다음 API를 제공합니다.

OpenGL ES 3.0

표준 OpenGL ES 3.0 헤더 <GLES3/gl3.h><GLES3/gl3ext.h>에는 네이티브 코드에서 OpenGL ES 3.0 렌더링 호출을 수행하는 데 필요한 선언이 포함되어 있습니다. 이러한 렌더링 호출을 통해 GLSL 언어를 사용하여 버텍스와 프래그먼트 셰이더를 정의하고 사용할 수 있습니다.

OpenGL ES 3.0을 사용하려면 Android.mk 파일에 다음 줄을 포함하여 /system/lib/libGLESv3.so에 네이티브 모듈 링크를 겁니다.

    LOCAL_LDLIBS := -lGLESv3
    

모든 기기가 OpenGL ES 3.0을 지원하는 것은 아닙니다. 앱은 OpenGL ES 버전 문자열과 확장 프로그램 문자열을 쿼리하여 현재 기기가 앱에 필요한 기능을 지원하는지 확인할 수 있습니다. 이 쿼리를 수행하는 방법에 대한 자세한 내용은 OpenGL 사양의 glGetString() 설명을 참조하세요.

또한 manifest 파일에 <uses-feature> 태그를 지정하여 애플리케이션에 필요한 OpenGL ES 버전을 표시해야 합니다. <uses-feature>의 OpenGL ES 설정에 대한 자세한 내용은 OpenGL ES를 참조하세요.

gles3jni 샘플 애플리케이션은 NDK와 함께 OpenGL ES 3.0을 사용하는 방법에 대한 기본적인 예를 제공해줍니다.

Android API 레벨 21

NDK는 Android 4.3 시스템 이미지 이상에서 실행되는 네이티브 코드 개발을 위해 다음 API를 제공합니다.

OpenGL ES 3.1

표준 OpenGL ES 3.1 헤더 <GLES3/gl31.h><GLES3/gl3ext.h>에는 네이티브 코드에서 OpenGL ES 3.1 렌더링 호출을 수행하는 데 필요한 선언이 포함되어 있습니다. 이러한 렌더링 호출을 통해 GLSL 언어를 사용하여 버텍스와 프래그먼트 셰이더를 정의하고 사용할 수 있습니다.

OpenGL ES 3.1을 사용하려면 Android.mk 파일에 다음 줄을 포함하여 /system/lib/libGLESv3.so에 네이티브 모듈 링크를 겁니다.

    LOCAL_LDLIBS := -lGLESv3
    

모든 기기가 OpenGL ES 3.1을 지원하는 것은 아닙니다. 앱은 OpenGL ES 버전 문자열과 확장 프로그램 문자열을 쿼리하여 현재 기기가 앱에 필요한 기능을 지원하는지 확인할 수 있습니다. 이 쿼리를 수행하는 방법에 대한 자세한 내용은 OpenGL 사양의 glGetString() 설명을 참조하세요.

또한 manifest 파일에 <uses-feature> 태그를 지정하여 애플리케이션에 필요한 OpenGL ES 버전을 표시해야 합니다. <uses-feature>의 OpenGL ES 설정에 대한 자세한 내용은 OpenGL ES를 참조하세요.

gles3jni 샘플 애플리케이션은 NDK와 함께 OpenGL ES 3.1을 사용하는 방법에 대한 기본적인 예를 제공해줍니다.

참고: Android 에뮬레이터는 OpenGL ES 3.1 하드웨어 에뮬레이션을 지원하지 않습니다. 이 API를 사용하는 코드를 실행하고 테스트하려면 OpenGL ES 3.1을 지원할 수 있는 하드웨어를 갖춘 실제 기기가 있어야 합니다.

Android API 레벨 23

NDK는 Android 6.0 이상 시스템 이미지에서 실행되는 네이티브 코드 개발을 위해 다음 API를 도입했습니다.

추적

네이티브 추적 API(<android/trace.h>)는 자바 프로그래밍 언어로 된 android.os.trace 메서드의 네이티브 버전을 제공합니다. 이 API를 사용하면 시스템 추적 버퍼에 추적 이벤트를 작성하여 네이티브 코드에서 이름이 지정된 작업 단위를 추적할 수 있습니다. 그런 다음, Systrace 도구를 사용하여 추적 이벤트를 수집하고 분석할 수 있습니다. 이 API 사용에 대한 자세한 내용은 네이티브 추적을 참조하세요.

Android API 레벨 24

NDK는 Android 7.0 이상 시스템 이미지에서 실행되는 네이티브 코드 개발을 위해 다음 API를 도입했습니다.

Vulkan

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

Android 앱에서 Vulkan을 사용하는 방법을 자세히 알아보려면 API 문서를 참조하세요. 코드 샘플은 GitHub에서 vulkan-basic-samplesandroid-vulkan-tutorials 프로젝트를 참조하세요.

카메라

네이티브 카메라 API는 자바 프로그래밍 언어로 된 android.hardware.camera2 클래스의 네이티브 버전을 제공합니다. 네이티브 카메라 API를 사용하면 네이티브 코드에서 세분화된 사진 캡처 및 처리를 수행할 수 있습니다. 자바 camera2 API와 달리, 네이티브 카메라 API는 지원 중단된 카메라 HAL 1.0 구현을 지원하지 않습니다(즉, 네이티브 카메라 API에서 사용할 수 있는 카메라 목록에는 LEGACY 하드웨어 수준이 포함된 카메라 기기가 나열되지 않음).

Choreographer

네이티브 Choreographer API(<android/choreographer.h>)는 자바로 된 android.view.Choreographer 클래스의 네이티브 버전입니다. 네이티브 Choreographer API를 통해 네이티브 코드에서 애니메이션, 입력 및 그리기 타이밍을 조정할 수 있습니다. 이 API는 vsync와의 동기화를 제공하여 프레임 속도를 조정하는 데 유용합니다. Choreographer API 사용 방법에 대한 예는 GitHub에서 Teapots 샘플 프로젝트choreographer-30fps 디렉토리를 참조하세요.

멀티 네트워크

네이티브 멀티 네트워크 API(<android/multinetwork.h>)를 사용하면 네이티브 코드가 Android 5.0에서 추가된 자바 멀티 네트워킹 API와 동일한 기능에 액세스할 수 있습니다.

EGL

Android API 레벨 24에 대한 EGL 지원은 다음의 확장 프로그램을 지원합니다.

NDK의 EGL 지원에 대한 자세한 내용은 EGL을 참조하세요.

OpenGL ES 3.2

표준 OpenGL ES 3.2 헤더 <GLES3/gl32.h><GLES3/gl3ext.h>에는 네이티브 코드에서 OpenGL ES 3.2 렌더링 호출을 수행하는 데 필요한 선언이 포함되어 있습니다.

OpenGL ES 3.2를 사용하려면 Android.mk 파일에 다음 줄을 포함하여 /system/lib/libGLESv3.so에 네이티브 모듈 링크를 겁니다.

    LOCAL_LDLIBS := -lGLESv3
    

모든 기기가 OpenGL ES 3.2를 지원하는 것은 아닙니다. 앱은 OpenGL ES 버전 문자열과 확장 프로그램 문자열을 쿼리하여 현재 기기가 앱에 필요한 기능을 지원하는지 확인할 수 있습니다. 이 쿼리를 수행하는 방법에 대한 자세한 내용은 OpenGL 사양의 glGetString() 설명을 참조하세요.

또한 manifest 파일에 <uses-feature> 태그를 지정하여 애플리케이션에 필요한 OpenGL ES 버전을 표시해야 합니다. <uses-feature>의 OpenGL ES 설정에 대한 자세한 내용은 OpenGL ES를 참조하세요.

Android API 레벨 26

NDK는 Android 8.0 이상 시스템 이미지에서 실행되는 네이티브 코드 개발을 위해 다음 API를 도입했습니다.

AAudio

NDK는 지연 시간이 짧아야 하는 고성능 오디오 앱을 위해 AAudio API(<aaudio/AAudio.h>)를 도입했습니다. AAudio를 사용하는 앱은 오디오 스트림에 데이터를 읽고 씁니다. AAudio는 OpenSL ES보다 더 쉽게 사용할 수 있는 대안 API로 제공됩니다. 이 API 사용에 대한 자세한 내용은 AAudio 개발자 가이드를 참조하세요.

하드웨어 버퍼

NDK는 프로세스 간 버퍼 관리를 위한 자체 파이프라인을 만들 수 있는 두 가지 네이티브 API를 도입했습니다.

네이티브 하드웨어 버퍼 API(<android/hardware_buffer.h>)를 사용하면 직접 버퍼를 할당하여 프로세스 간 버퍼 관리를 위한 자체 파이프라인을 만들 수 있습니다. AHardwareBuffer 구조체를 할당하고 사용하여 eglGetNativeClientBufferANDROID 확장 프로그램을 통해 EGLClientBuffer 리소스 유형을 가져올 수 있습니다. 이 버퍼를 eglCreateImageKHR에 전달하여 EGLImage 리소스 유형을 만든 다음, 지원되는 기기에서 glEGLImageTargetTexture2DOES를 통해 이 리소스 유형을 텍스처에 연결할 수 있습니다. 이렇게 하면 프로세스 간에 공유되는 텍스처를 만드는 데 유용할 수 있습니다.

네이티브 하드웨어 버퍼 JNI API(<android/hardware_buffer_jni.h>)를 사용하면 HardwareBuffer 객체를 가져올 수 있으며, 이 객체는 Parcelable이므로 서로 다른 두 프로세스 간에 전송될 수 있습니다. 이를 통해 앱은 내부 Android API에 액세스하지 않고도 SurfaceFlinger과 유사한 기능(예: 프로세스 간 자체 버퍼 대기열 만들기)을 사용할 수 있습니다.

공유 메모리

공유 메모리 API(<android/sharedmem.h>)는 Android 네이티브 공유 메모리 주변을 감싸는 래퍼입니다. 이 API는 프로세스 간 통신에 사용할 수 있습니다. 공유 메모리를 생성하면 파일 설명자가 핸들로 반환됩니다. mmap()를 사용하여 파일 설명어를 프로세스의 메모리 공간에 매핑한 후 공유 메모리의 콘텐츠에 액세스할 수 있습니다. 매핑을 제거하려면 munmap()를 호출합니다. 파일 설명어는 UNIX 도메인 소켓을 통해 다른 프로세스와 교환할 수 있습니다. 관련 파일 설명어가 닫히고 모든 메모리 맵이 전체 프로세스에서 매핑 해제되면 시스템이 할당된 공유 메모리를 해제합니다.

Android API 레벨 27

NDK는 Android 8.1 이상 시스템 이미지에서 실행되는 네이티브 코드 개발을 위해 다음 API를 도입했습니다.

Neural Networks API

Neural Networks API(<android/neuralnetworks.h>)는 온디바이스 머신러닝 작업을 위한 하드웨어 가속 기능을 앱에 제공합니다. 이 API에서는 온디바이스 모델 만들기, 컴파일 및 실행을 지원합니다. 일반적으로 앱은 NNAPI를 직접 사용하지 않습니다. 대신, 이 API는 개발자가 모델을 학습시키고 Android 기기에 배포할 수 있는 머신러닝 라이브러리, 프레임워크 및 도구를 통해 호출됩니다. 자세한 내용은 Neural Networks API 개발자 가이드API 참조를 확인합니다.