미리 컴파일 된 라이브러리를 사용하여
NDK는 사용 미리 컴파일 된 라이브러리 (정적 및 공유 라이브러리를 모두 지원)를 지원합니다. 이 기능은 두 가지 주요 사용 사례가 있습니다 :
- (소스 코드를 배포하지 않음) 써드 파티 개발자에 자신의 라이브러리 NDK를 배포합니다.
- 컴파일 속도를 향상하기 위해 미리 컴파일 된 버전의 자신의 라이브러리를 사용합니다.
이 페이지는 미리 컴파일 된 라이브러리를 사용하는 방법에 대해 설명합니다.
문 미리 컴파일 된 라이브러리
각 문에 대해 미리 컴파일 된 라이브러리는 별도의 모듈로 자신을 사용해야합니다. 이렇게하려면 다음 단계를 수행하십시오 :
- 모듈의 이름을 입력합니다. 이 이름은 반드시 같은 이름의 미리 컴파일 된 라이브러리 자체가 아닙니다.
- 모듈에서
Android.mk
파일, 미리 컴파일 된 라이브러리의 경로는 당신이 할당 제공합니다LOCAL_SRC_FILES
. 지정LOCAL_PATH
변수로의 상대 값.참고 : 대상은 ABI에 대응하는 라이브러리의 미리 컴파일 된 버전을 선택해야합니다. 라이브러리가 ABI를 지원하는지 확인하는 방법에 대한 자세한 내용을 참조하시기 바랍니다 ABI 미리 컴파일 된 라이브러리를 선택합니다 .
- 당신이 공유 라이브러리 (사용에 따라
.so
) 또는 정적 라이브러리 (.a
), 추가PREBUILT_SHARED_LIBRARY
또는PREBUILT_STATIC_LIBRARY
.
다음 예는 작은 도서관을 미리 컴파일 된 것으로 가정 libfoo.so
하고 설명 Android.mk
같은 디렉토리에 파일을.
LOCAL_PATH : = $ (내-DIR 전화) $ (CLEAR_VARS)를 포함 LOCAL_MODULE를 = foo는-미리 만들어진 LOCAL_SRC_FILES을 =이 libfoo.so $을 포함 (PREBUILT_SHARED_LIBRARY를)
이 예에서, 동일한 모듈 이름 및 컴파일 된 라이브러리 명.
당신은 배치 미리 컴파일 된 사본의 공유 라이브러리 컴파일됩니다 $PROJECT/obj/local
에, 그리고 사본은 다른 추출 디버그 정보가 배치 될 것 $PROJECT/libs/<abi>
입니다. 여기에 $PROJECT
프로젝트의 루트 디렉토리입니다.
다른 모듈에서 참조는 라이브러리를 컴파일 사전
다른 모듈에서 참조는 다음과 관련된 모듈, 라이브러리를 사전 컴파일 된 Android.mk
파일을 미리 컴파일 된 라이브러리의 이름을 지정 LOCAL_STATIC_LIBRARIES
또는 LOCAL_SHARED_LIBRARIES
변수입니다.
예를 들어, 사용하는 libfoo.so
모듈은 다음 지침과 유사 할 수 있습니다 :
$ (CLEAR_VARS)를 포함 LOCAL_MODULE을 : foo는 사용자 = LOCAL_SRC_FILES을 : foo는-user.c의 = LOCAL_SHARED_LIBRARIES은 : foo는-사전 구축이 = (BUILD_SHARED_LIBRARY) $을 포함
다음 LOCAL_MODULE
모듈 미리 컴파일 된 라이브러리의 참조 이름은, LOCAL_SHARED_LIBRARIES
미리 컴파일 된 라이브러리 이름 자체.
수출 미리 컴파일 된 헤더 라이브러리
foo-user.c
일반적으로 위치 코드는 헤더 파일 (예를 들어,에 따라 foo.h
특정 문), 헤더 파일은 미리 컴파일 된 라이브러리를 사용하여 할당됩니다. 예를 들어, foo-user.c
다음과 비슷한 코드 줄이있을 수 있습니다 :
#INCLUDE <foo.h>
당신이 컴파일하는 경우이 경우, foo-user
모듈을, 당신은 헤더와 자신의 경로 컴파일러를 포함하는 점을 제공해야합니다. 이 작업을 수행하는 간단한 방법은 미리 컴파일 된 모듈 정의에서 내보내기 컨텐츠를 사용하는 것입니다. 예를 들어, 한 헤더는 다음과 같이 foo.h
미리 컴파일 된 모듈과 관련 위치한 include
디렉토리, 당신은 다음과 같은 방식으로 선언 할 수 있습니다 :
$ (CLEAR_VARS)를 포함 LOCAL_MODULE을 : foo는-미리 작성된 = = libfoo.so : LOCAL_SRC_FILES LOCAL_EXPORT_C_INCLUDES : = $ (LOCAL_PATH) / 포함 $을 포함을 (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 86 / libfoo.so
다음 코드는 사용하는 방법을 보여줍니다 TARGET_ARCH_ABI
라이브러리의 해당 버전을 선택하도록 시스템을 컴파일하기 위해 :
$ (CLEAR_VARS)를 포함 LOCAL_MODULE을 : foo는-미리 작성된 = = $ (TARGET_ARCH_ABI) /libfoo.so : LOCAL_SRC_FILES LOCAL_EXPORT_C_INCLUDES : = $ (LOCAL_PATH) / 포함 $을 포함을 (PREBUILT_SHARED_LIBRARY)
당신이 경우 armeabi
로 지정된 TARGET_ARCH_ABI
값, 컴파일러에있는 시스템을 사용하는 armeabi
디렉토리 libfoo.so
버전. 당신이 경우 x86
로 지정된 TARGET_ARCH_ABI
값, 컴파일러는 시스템 사용 x86
디렉토리 버전.