다른 빌드 시스템과 함께 NDK 사용

NDK에는 ndk-buildCMake의 공식 지원이 포함되어 있습니다. 대부분의 사용자는 애플리케이션 코드 빌드 중 하나를 참조해야 합니다. 이 문서의 목적은 다른 빌드 시스템을 사용하는 기존 코드를 빌드하는 방법을 설명하는 것입니다. 이는 주로 OpenSSL 및 libbzip2와 같은 Android용이 아닌 제3자 종속성이 해당됩니다.

빌드 시스템에 네이티브 NDK 지원을 추가하려는 빌드 시스템 유지관리자는 대신 빌드 시스템 유지관리자 가이드를 참조해야 합니다.

개요

NDK r19 기준으로 NDK로 기본 설치된 도구 모음이 사용될 수 있습니다. 임의의 빌드 시스템으로 접속하는 데 더 이상 make_standalone_toolchain.py 스크립트는 필요하지 않습니다.

올바른 아키텍처를 빌드하려면 Clang을 호출할 때 -target로 적절한 대상을 전달하거나 대상이 접두사로 지정된 Clang을 호출하세요. 예를 들어 21의 minSdkVersion로 64비트 ARM Android를 컴파일하려면 다음 중 하나가 작동하며 가장 편리한 것을 사용할 수 있습니다.

$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/clang++ \
        -target aarch64-linux-android21 foo.cpp
    
$ $NDK/toolchains/llvm/prebuilt/$HOST_TAG/aarch64-linux-android21-clang++ \
        foo.cpp
    

두 가지 경우 모두 다음 표에 따라 다운로드한 NDK와 일치하도록 $NDK를 NDK 경로 및 $HOST_TAG로 대체하세요.

NDK OS 변형 호스트 태그
macOS darwin-x86_64
Linux linux-x86_64
32비트 Windows windows
64비트 Windows windows-x86_64

여기에서 접두사 또는 대상 인수의 형식은 minSdkVersion을 나타내는 접미사가 포함된 대상 3줄입니다. 이 접미사는 clang/clang++로만 사용되며 binutils 도구(예: arstrip)는 minSdkVersion의 영향을 받지 않기 때문에 접미사가 필요하지 않습니다. Android에서 지원하는 대상 3줄은 다음과 같습니다.

ABI 3줄
armeabi-v7a armv7a-linux-androideabi
arm64-v8a aarch64-linux-android
x86 i686-linux-android
x86-64 x86_64-linux-android

많은 프로젝트의 빌드 스크립트는 각 컴파일러가 하나의 OS/아키텍처 조합만 타겟팅하는 GCC 스타일 크로스 컴파일러를 기대하므로 -target를 깔끔하게 처리하지 않을 수 있습니다. 이 경우 접두사가 3줄인 Clang 바이너리를 사용하는 것이 좋습니다.

Autoconf

Autoconf 프로젝트를 사용하면 환경 변수로 사용하는 도구 모음을 지정할 수 있습니다. 예를 들어 다음은 Linux에서 API 수준 21의 minSdkVersion으로 Android x86-64용 libpng를 빌드하는 방법을 보여줍니다.

# Check out the source.
    git clone https://github.com/glennrp/libpng
    cd libpng
    # Only choose one of these, depending on your build machine...
    export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64
    export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
    # Only choose one of these, depending on your device...
    export TARGET=aarch64-linux-android
    export TARGET=armv7a-linux-androideabi
    export TARGET=i686-linux-android
    export TARGET=x86_64-linux-android
    # Set this to your minSdkVersion.
    export API=21
    # Configure and build.
    export AR=$TOOLCHAIN/bin/$TARGET-ar
    export AS=$TOOLCHAIN/bin/$TARGET-as
    export CC=$TOOLCHAIN/bin/$TARGET$API-clang
    export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
    export LD=$TOOLCHAIN/bin/$TARGET-ld
    export RANLIB=$TOOLCHAIN/bin/$TARGET-ranlib
    export STRIP=$TOOLCHAIN/bin/$TARGET-strip
    ./configure --host $TARGET
    make
    

Autoconf가 아닌 Make 프로젝트

일부 Makefile 프로젝트는 autoconf 프로젝트와 동일한 변수를 재정의하여 크로스 컴파일을 허용합니다. 예를 들어 다음은 21의 minSdkVersion으로 Android x86-64용 libbzip2를 빌드하는 방법을 보여줍니다.

# Check out the source.
    git clone https://gitlab.com/bzip/bzip2.git
    cd bzip2

    # Only choose one of these, depending on your build machine...
    export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/darwin-x86_64
    export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64

    # Only choose one of these, depending on your device...
    export TARGET=aarch64-linux-android
    export TARGET=armv7a-linux-androideabi
    export TARGET=i686-linux-android
    export TARGET=x86_64-linux-android

    # Set this to your minSdkVersion.
    export API=21

    # Build.
    make \
        CC=$TOOLCHAIN/bin/$TARGET$API-clang \
        AR=$TOOLCHAIN/bin/$TARGET-ar \
        RANLIB=$TOOLCHAIN/bin/$TARGET-ranlib \
        bzip2