他のビルドシステムで NDK を使用する

NDK は、ndk-buildCMake を公式にサポートしています。ほとんどのユーザーにとって、アプリケーション コードのビルドに関する各種ガイドの参照が必要になります。このドキュメントでは、他のビルドシステムを使用している既存のコードをビルドする方法を説明します。多くの場合、OpenSSL や libbzip2 など、Android 固有ではないサードパーティの依存関係がある場合がこれに該当します。

ビルドシステムのメンテナンスとしてビルドシステムにネイティブ NDK サポートを追加する場合は、ビルドシステム メンテナンス ガイドの方をお読みください。

概要

NDK の Clang コンパイラは、ターゲットの環境を定義するために必要な最小限の設定のみで使用できます。

正しいアーキテクチャ向けにビルドできるよう、 Clang の呼び出し時に -target を指定したターゲット。たとえば、64 ビット用にコンパイルするには、 minSdkVersion が 21 の ARM Android で、次の手順を実施します。

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

別の方法として、Clang にはターゲット プレフィックス付きのエントリ ポイントがあります。たとえば NDK リリースに応じて、シンボリック リンクまたは Clang に転送するスクリプト ホスト OS などです次のように、--target を使用して Clang を直接呼び出すと、信頼性が向上します。 これは最もテストされたワークフローであり、引数の転送が スクリプトのバグなどですWindows では、転送時に必要だった追加の CreateProcess スクリプトから実際のコンパイラへの指示により、 パフォーマンスに悪影響を及ぼします

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

いずれの場合も、$NDK を NDK のパスに、$HOST_TAG を下記の表のとおりにダウンロードした NDK に置き換えます。

NDK OS 種別 ホストタグ
macOS darwin-x86_64
Linux linux-x86_64
64 ビット Windows windows-x86_64

ここでのプレフィックスまたはターゲット引数の形式は、ターゲットの 3 つの組に minSdkVersion を表すサフィックスを付けたものです。このサフィックス 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 とアーキテクチャの組み合わせを 1 組のみターゲットとする GCC 方式のクロス コンパイラが想定されているため、-target を適切に処理できない場合があります。このような場合には通常、-target 引数(例: CC="clang -target aarch64-linux-android21)を渡す必要があります。まれに、使用しているビルドシステムが そのフォームを使用できない場合は、トリプル プレフィックスが付いた Clang バイナリを使用します。

Autoconf

Autoconf プロジェクトでは、環境変数とともに使用するツールチェーンを指定できます。たとえば、次の例は、Linux で API レベル 21 の minSdkVersion を使用して Android x86-64 用の libpng をビルドする方法を示しています。

# Check out the source.
git clone https://github.com/glennrp/libpng -b v1.6.37
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/llvm-ar
export CC="$TOOLCHAIN/bin/clang --target=$TARGET$API"
export AS=$CC
export CXX="$TOOLCHAIN/bin/clang++ --target=$TARGET$API"
export LD=$TOOLCHAIN/bin/ld
export RANLIB=$TOOLCHAIN/bin/llvm-ranlib
export STRIP=$TOOLCHAIN/bin/llvm-strip
./configure --host $TARGET
make

このサンプルで選択したツールは、NDK r22 以降に対応しています。それよりも古い NDK では、別のツールが必要になる場合があります。

Autoconf 以外の make プロジェクト

Makefile プロジェクトの中には、autoconf プロジェクトの場合と同じ変数をオーバーライドすることでクロス コンパイルできるものもあります。たとえば、次の例は、minSdkVersion 21 を使用して 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/clang --target=$TARGET$API" \
    AR=$TOOLCHAIN/bin/llvm-ar \
    RANLIB=$TOOLCHAIN/bin/llvm-ranlib \
    bzip2

このサンプルで選択したツールは、NDK r22 以降に対応しています。それよりも古い NDK では、別のツールが必要になる場合があります。