미리 빌드된 라이브러리 사용

NDK는 미리 빌드된 라이브러리(정적 및 공유 라이브러리 모두 포함)를 사용할 수 있도록 지원합니다. 이러한 기능의 주요 사용 사례는 다음 두 가지입니다.

  • 소스를 배포하지 않고 제3자 NDK 개발자에게 자체 라이브러리 배포
  • 자체 라이브러리의 미리 빌드된 버전을 사용하여 빌드 시간 단축

이 페이지에서는 미리 빌드된 라이브러리의 사용 방법을 설명합니다.

미리 빌드된 라이브러리 선언

단일 독립 모듈로 사용할 각각의 미리 빌드된 라이브러리를 선언해야 합니다. 선언하려면 다음 단계를 수행하세요.

  1. 모듈의 이름을 지정합니다. 이 이름이 미리 빌드된 라이브러리 자체의 이름과 동일할 필요는 없습니다.
  2. 모듈의 Android.mk 파일에서, 제공할 미리 빌드된 라이브러리의 경로를 LOCAL_SRC_FILES에 할당합니다. LOCAL_PATH 변숫값을 기준으로 상대적인 경로를 지정합니다.

    참고: 미리 빌드된 라이브러리의 버전을 대상 ABI에 적합하게 선택해야 합니다. ABI 라이브러리 지원 확보에 대한 자세한 내용은 미리 빌드된 라이브러리 ABI 선택을 참조하세요.

  3. 사용하는 라이브러리가 공유(.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)
    

armeabiTARGET_ARCH_ABI 값으로 지정한 경우 빌드 시스템은 armeabi 디렉토리에 있는 libfoo.so 버전을 사용합니다. x86TARGET_ARCH_ABI 값으로 지정한 경우 빌드 시스템은 x86 디렉토리의 버전을 사용합니다.