Sử dụng NDK với các hệ thống xây dựng khác

NDK chứa các tính năng hỗ trợ chính thức dành cho ndk-buildCMake. Hầu hết người dùng sẽ tham khảo một trong những hướng dẫn tạo mã ứng dụng đó. Mục đích của tài liệu này là mô tả cách tạo mã hiện có bằng các hệ thống xây dựng khác. Trường hợp này thường xảy ra với các phần phụ thuộc bên thứ ba không dành riêng cho Android, chẳng hạn như OpenSSL và libbzip2.

Nếu là một đơn vị phụ trách duy trì hệ thống xây dựng đang muốn tìm cách thêm tính năng hỗ trợ NDK gốc vào hệ thống xây dựng của mình thì bạn nên đọc nội dung Hướng dẫn duy trì hệ thống xây dựng.

Tổng quan

Bạn có thể dùng trình biên dịch Clang trong NDK chỉ với cấu hình tối thiểu cần thiết để xác định môi trường đích của mình.

Để đảm bảo bạn xây dựng cho đúng kiến trúc, hãy truyền mục tiêu thích hợp bằng -target khi gọi Clang hoặc gọi Clang có tiền tố mục tiêu. Ví dụ: để biên dịch cho Android ARM 64 bit với minSdkVersion là 21, cả hai phương án sau đây đều hiệu quả và bạn có thể sử dụng phương án mà bạn thấy thuận tiện nhất:

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

Trong cả hai trường hợp, hãy thay thế $NDK bằng đường dẫn đến NDK và $HOST_TAG để khớp với phiên bản NDK mà bạn đã tải xuống theo bảng sau:

Biến thể NDK dành cho hệ điều hành Thẻ lưu trữ
macOS darwin-x86_64
Linux linux-x86_64
Windows 64 bit windows-x86_64

Định dạng của tiền tố hoặc đối số mục tiêu ở đây là bộ ba mục tiêu với một hậu tố biểu thị minSdkVersion. Hậu tố này chỉ được dùng với clang/clang++. Các công cụ binutils (chẳng hạn như arstrip) không đòi hỏi hậu tố vì không chịu ảnh hưởng của minSdkVersion. Sau đây là bộ ba mục tiêu được Android hỗ trợ:

ABI Bộ ba
armeabi-v7a armv7a-linux-androideabi
arm64-v8a aarch64-linux-android
x86 i686-linux-android
x86-64 x86_64-linux-android

Thông thường, tập lệnh bản dựng của nhiều dự án sẽ có các trình biên dịch chéo theo kiểu GCC, trong đó mỗi trình biên dịch chỉ nhắm đến một tổ hợp hệ điều hành/kiến trúc nên có thể sẽ không xử lý -target thật gọn ghẽ. Trong những trường hợp này, bạn thường có thể đưa đối số -target vào định nghĩa trình biên dịch (ví dụ: CC="clang -target aarch64-linux-android21) hoặc sử dụng các tệp nhị phân Clang có 3 tiền tố.

Autoconf

Với những dự án Autoconf, bạn có thể chỉ định chuỗi công cụ để sử dụng với các biến môi trường. Ví dụ: nội dung sau đây cho biết cách xây dựng libpng dành cho Android x86-64 với minSdkVersion là API cấp 21 trên Linux.

# 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/$TARGET$API-clang
export AS=$CC
export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
export LD=$TOOLCHAIN/bin/ld
export RANLIB=$TOOLCHAIN/bin/llvm-ranlib
export STRIP=$TOOLCHAIN/bin/llvm-strip
./configure --host $TARGET
make

Các công cụ được chọn trong mẫu này là chính xác cho NDK r22 trở lên. Các phiên bản NDK cũ có thể cần đến các công cụ khác.

Dự án make không phải autoconf

Một số dự án makefile cho phép biên dịch chéo bằng cách ghi đè các biến giống nhau, tương tự như cách mà bạn sẽ thực hiện với dự án autoconf. Ví dụ: sau đây là cách tạo libbzip2 dành cho Android x86-64 với minSdkVersion là 21.

# 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/llvm-ar \
    RANLIB=$TOOLCHAIN/bin/llvm-ranlib \
    bzip2

Các công cụ được chọn trong mẫu này là chính xác cho NDK r22 trở lên. Các phiên bản NDK cũ có thể cần đến các công cụ khác.