NDK는 미리 빌드된 라이브러리(정적 및 공유 라이브러리 모두 포함)를 사용할 수 있도록 지원합니다. 이러한 기능의 주요 사용 사례는 다음 두 가지입니다.
- 소스를 배포하지 않고 제3자 NDK 개발자에게 자체 라이브러리 배포
- 자체 라이브러리의 미리 빌드된 버전을 사용하여 빌드 시간 단축
이 페이지에서는 미리 빌드된 라이브러리의 사용 방법을 설명합니다.
미리 빌드된 라이브러리 선언
독립 모듈로 사용할 각각의 미리 빌드된 라이브러리를 선언해야 합니다. 선언하려면 다음 단계를 실행하세요.
- 모듈의 이름을 지정합니다. 이 이름이 미리 빌드된 라이브러리 자체의 이름과 동일할 필요는 없습니다.
모듈의 Android.mk 파일에서, 제공할 미리 빌드된 라이브러리의 경로를
LOCAL_SRC_FILES
에 할당합니다.LOCAL_PATH
변숫값을 기준으로 상대적인 경로를 지정합니다.사용하는 라이브러리가 공유(
.so
) 라이브러리인지 정적(.a
) 라이브러리인지에 따라PREBUILT_SHARED_LIBRARY
또는PREBUILT_STATIC_LIBRARY
를 포함합니다.
다음에 있는 간단한 예에서는 미리 빌드된 라이브러리 libfoo.so
가 이 라이브러리를 설명하는 Android.mk 파일과 같은 디렉터리에 있다고 가정합니다.
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := libfoo.so
include $(PREBUILT_SHARED_LIBRARY)
이 예에서는 모듈의 이름이 미리 빌드된 라이브러리의 이름과 같습니다.
빌드 시스템은 미리 빌드된 공유 라이브러리의 사본을 $PROJECT/obj/local
에 배치하고 디버그 정보를 제거한 다른 사본은 $PROJECT/libs/<abi>
에 배치합니다. 여기에서 $PROJECT
는 프로젝트의 루트 디렉터리입니다.
다른 모듈에서 미리 빌드된 라이브러리 참조
다른 모듈에서 미리 빌드된 라이브러리를 참조하려면 이러한 다른 모듈과 연결된 Android.mk 파일의 LOCAL_STATIC_LIBRARIES
또는 LOCAL_SHARED_LIBRARIES
변숫값으로 이름을 지정합니다.
예를 들어 libfoo.so
를 사용하는 모듈에 대한 설명은 다음과 같을 수 있습니다.
include $(CLEAR_VARS)
LOCAL_MODULE := foo-user
LOCAL_SRC_FILES := foo-user.c
LOCAL_SHARED_LIBRARIES := foo-prebuilt
include $(BUILD_SHARED_LIBRARY)
여기서 LOCAL_MODULE
은 미리 빌드된 라이브러리를 참조하는 모듈의 이름이고 LOCAL_SHARED_LIBRARIES
는 미리 빌드된 라이브러리 자체의 이름입니다.
미리 빌드된 라이브러리의 헤더 내보내기
foo-user.c
의 코드는 미리 빌드된 라이브러리와 함께 배포된 foo.h
와 같은 헤더 파일에 일반적으로 있는 특정 선언에 따라 다릅니다. 예를 들어 foo-user.c
에는 다음과 같은 줄이 있을 수 있습니다.
#include <foo.h>
이 경우 foo-user
모듈을 빌드할 때 컴파일러 경로를 포함하는 헤더를 제공해야 합니다. 이 작업을 간단하게 실행하는 방법은 미리 빌드된 모듈 정의에 내보내기를 사용하는 것입니다. 예를 들어 foo.h
헤더가 미리 빌드된 모듈과 연결된 include
디렉터리 아래에 있는 경우 다음과 같이 선언할 수 있습니다.
include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := libfoo.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
여기서 LOCAL_EXPORT_C_INCLUDES
정의를 통해 빌드 시스템이 미리 빌드된 라이브러리의 include
디렉터리로 경로를 내보내서 시스템에 종속된 모듈의 LOCAL_C_INCLUDES
값 앞에 이 경로를 추가해야 합니다.
이 작업을 통해 빌드 시스템이 필요한 헤더를 찾을 수 있습니다.
미리 빌드된 라이브러리 디버그
디버그 기호를 포함한 미리 빌드된 공유 라이브러리를 제공하는 것이 좋습니다. NDK 빌드 시스템은 항상 $PROJECT/libs/<abi>/
에 설치한 라이브러리 버전에서 기호를 제거하지만 ndk-gdb
로 디버깅하기 위해 디버그 버전을 사용할 수 있습니다.
미리 빌드된 라이브러리의 ABI 선택
미리 빌드된 공유 라이브러리의 버전을 타겟 ABI에 적합하게 선택해야 합니다. Android.mk 파일의 TARGET_ARCH_ABI
변수를 사용하여 적합한 라이브러리 버전의 빌드 시스템을 가리킬 수 있습니다.
예를 들어 프로젝트에 libfoo.so
라이브러리의 두 가지 버전이 있다고 가정합니다.
armeabi/libfoo.so
x86/libfoo.so
다음 스니펫은 빌드 시스템이 적합한 버전의 라이브러리를 선택하도록 TARGET_ARCH_ABI
를 사용하는 방법을 보여줍니다.
include $(CLEAR_VARS)
LOCAL_MODULE := foo-prebuilt
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libfoo.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
armeabi
를 TARGET_ARCH_ABI
값으로 지정한 경우 빌드 시스템은 armeabi
디렉터리에 있는 libfoo.so
버전을 사용합니다. x86
을 TARGET_ARCH_ABI
값으로 지정했다면 빌드 시스템은 x86
디렉터리의 버전을 사용합니다.