Android

Triplet x64-android, arm-neon-android, dan arm64-android diuji oleh integrasi berkelanjutan registri yang dikumpulkan vcpkg.

Persyaratan build Android

  1. Mengunduh Android NDK

  2. Atur variabel lingkungan ANDROID_NDK_HOME ke instalasi Android NDK Anda untuk mengonfigurasi toolchain Android. Contohnya:

    export ANDROID_NDK_HOME=/home/your-account/Android/Sdk/ndk-bundle
    

    Atau:

    export ANDROID_NDK_HOME=/home/your-account/Android/android-ndk-r26d
    

Catatan: Anda masih perlu menginstal pengkompilasi g++ atau C++ yang menargetkan host Anda untuk dependensi host apa pun.

kembar tiga vcpkg dan Android ABI yang sesuai

Ada enam ABI Android yang berbeda, yang masing-masing memetakan ke triplet vcpkg. Tabel berikut menguraikan pemetaan dari arsitektur vcpkg ke arsitektur android:

VCPKG_TARGET_TRIPLET ANDROID_ABI ANDROID_ARM_NEON
arm64-android arm64-v8a
arm-android armeabi-v7a TIDAK AKTIF
arm-neon-android armeabi-v7a AKTIF
x64-android x86_64
x86-android x86
armv6-android armeabi

Membangun pustaka Android dalam kontainer Docker

Anda dapat membuat pustaka Android, seperti jsoncpp dalam kontainer Docker Ubuntu.

Buat Dockerfile dengan konten berikut:

FROM ubuntu:22.04

ENV DEBIAN_FRONTEND noninteractive

RUN \
  apt-get update && \
  apt-get -y upgrade

RUN \
  apt-get -y --no-install-recommends install git g++ wget curl zip vim pkg-config tar cmake unzip ca-certificates

# Download Android NDK
RUN \
  wget https://dl.google.com/android/repository/android-ndk-r26d-linux.zip && \
  unzip android-ndk-r26d-linux.zip && \
  rm -rf android-ndk-r26d-linux.zip

ENV ANDROID_NDK_HOME /android-ndk-r26d

RUN git clone https://github.com/microsoft/vcpkg
WORKDIR vcpkg
RUN ./bootstrap-vcpkg.sh

ENV PATH "/vcpkg:$PATH"
ENV VCPKG_ROOT "/vcpkg"

WORKDIR /project

Buat gambar dan luncurkan kontainer baru:

docker build . -t "vcpkg-android"
docker run -it "vcpkg-android" bash

Dalam kontainer, buat /project/vcpkg.json dengan konten berikut:

{
  "dependencies": [
    "jsoncpp"
  ],
  "builtin-baseline": "1e68748a7c6914642ed686b2e19c3d688bca150a"
}

Terakhir, jalankan vcpkg install --triplet x64-android untuk membuat jsoncpp untuk android.

Menggunakan Vulkan SDK

vcpkg memiliki vulkan paket yang memungkinkan Anda untuk find_package(Vulkan). Untuk menggunakannya, Anda harus memberikan VULKAN_SDK variabel lingkungan.

export VULKAN_SDK=/usr/local
./vcpkg install vulkan

NDK sudah berisi header Vulkan dan libvulkan.so biner untuk setiap arsitekturnya.

Untuk mengeksposnya ke vcpkg, Anda dapat mempertimbangkan export VULKAN_SDK=... untuk setiap penginstalan. Tetapi dengan menempatkan set(ENV{VULKAN_SDK} ...) dalam file triplet, Anda dapat melewati pekerjaan yang melelahkan.

Jika Anda menggunakan NDK 21.3.6528147 atau versi yang lebih lama, itu akan seperti berikut ini:

# In android triplets... (e.g. arm64-android.cmake)
set(VCPKG_CMAKE_SYSTEM_NAME Android)
# ...
# If your API level is 30, libvulkan.so is at $ENV{ANDROID_NDK_HOME}/platforms/android-30/arch-arm64/usr/lib
set(ENV{VULKAN_SDK} $ENV{ANDROID_NDK_HOME}/sysroot/usr)

Perhatikan bahwa lokasi sysroot telah berubah sejak NDK 22. (Untuk informasi selengkapnya, lihat [BUG] header sysroot yang hilang sejak r22?).

Jika Anda lebih suka menggunakan versi terbaru, periksa BuildSystemMaintainers.md dokumen NDK lalu letakkan jalur yang sesuai untuk sistem Anda.

Misalnya, pengguna MacOS akan menggunakan jalur seperti contoh ini:

# In android triplets... (e.g. arm64-android.cmake)
set(VCPKG_CMAKE_SYSTEM_NAME Android)
# ...
# If your API level is 30, libvulkan.so is at $ENV{ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/lib/aarch64-linux-android/30
set(ENV{VULKAN_SDK} $ENV{ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr)

Dengan cara ini, Anda dapat menginstal vulkan dan paket yang memerlukannya untuk semua triplet Android. (misalnya vulkan-hpp)

'vcpkg install vulkan-hpp:arm64-android'
user@host$ ./vcpkg install vulkan-hpp:arm64-android
Computing installation plan...
The following packages will be built and installed:
  * vulkan[core]:arm64-android -> 1.1.82.1-1
    vulkan-hpp[core]:arm64-android -> 2019-05-11-1
Additional packages (*) will be modified to complete this operation.
Detecting compiler hash for triplet arm64-android...
...
Starting package 1/2: vulkan:arm64-android
Building package vulkan[core]:arm64-android...
-- Using community triplet arm64-android. This triplet configuration is not guaranteed to succeed.
-- [COMMUNITY] Loading triplet configuration from: /.../vcpkg/triplets/community/arm64-android.cmake
-- Querying VULKAN_SDK Environment variable
-- Searching /.../Library/Android/sdk/ndk/22.1.7171670/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/vulkan/ for vulkan.h
-- Found vulkan.h
-- Performing post-build validation
-- Performing post-build validation done
...
Building package vulkan[core]:arm64-android... done
Installing package vulkan[core]:arm64-android...
Installing package vulkan[core]:arm64-android... done
Elapsed time for package vulkan:arm64-android: 35.9 ms
Starting package 2/2: vulkan-hpp:arm64-android
Building package vulkan-hpp[core]:arm64-android...
-- Using community triplet arm64-android. This triplet configuration is not guaranteed to succeed.
-- [COMMUNITY] Loading triplet configuration from: /.../vcpkg/triplets/community/arm64-android.cmake
-- Using cached /.../vcpkg/downloads/KhronosGroup-Vulkan-Hpp-5ce8ae7fd0d9c0543d02f33cfa8a66e6a43e2150.tar.gz
-- Cleaning sources at /.../vcpkg/buildtrees/vulkan-hpp/src/e6a43e2150-4f344cd911.clean. Use --editable to skip cleaning for the packages you specify.
-- Extracting source /.../vcpkg/downloads/KhronosGroup-Vulkan-Hpp-5ce8ae7fd0d9c0543d02f33cfa8a66e6a43e2150.tar.gz
-- Using source at /.../vcpkg/buildtrees/vulkan-hpp/src/e6a43e2150-4f344cd911.clean
-- Performing post-build validation
-- Performing post-build validation done
...
Building package vulkan-hpp[core]:arm64-android... done
Installing package vulkan-hpp[core]:arm64-android...
Installing package vulkan-hpp[core]:arm64-android... done
Elapsed time for package vulkan-hpp:arm64-android: 144.5 ms

Total elapsed time: 1.013 s

The package vulkan-hpp:arm64-android is header only and can be used from CMake via:

    find_path(VULKAN_HPP_INCLUDE_DIRS "vulkan/vulkan.hpp")
    target_include_directories(main PRIVATE ${VULKAN_HPP_INCLUDE_DIRS})

Contoh Proyek Android

Folder docs/examples/vcpkg_android_example_cmake menyediakan contoh kerja, dengan pustaka Android yang menggunakan pustaka jsoncpp:

Detail lebih lanjut

  • CMakeLists.txt hanya menggunakan find_package dantarget_link_library

  • Skrip compile.sh memungkinkan Anda memilih pasangan yang cocok dari "android abi" / "vcpkg triplet" dan untuk menguji kompilasi

  • File dummy my_lib.cpp menggunakan pustaka jsoncpp

Nota

Contoh ini hanya mengkompilasi pustaka Android, karena kompilasi Aplikasi Android lengkap berada di luar cakupan dokumen ini.

Uji pada contoh: vcpkg_android.cmake

Uji menggunakan vcpkg_android.cmake.

Folder vcpkg_android_example_cmake_script memberikan contoh yang sama, dan menggunakan skrip cmake untuk menyederhanakan penggunaan.

Detail lebih lanjut

  • CMakeLists.txt utama memuat vcpkg_android.cmake jika bendera VCPKG_TARGET_ANDROID diatur:

    if (VCPKG_TARGET_ANDROID)
        include("cmake/vcpkg_android.cmake")
    endif()
    

    Penting

    Tempatkan baris ini sebelum memanggil project().

  • Skrip compile.sh menunjukkan bahwa kemudian dimungkinkan untuk mengkompilasi android menggunakan pemanggilan cmake sederhana, misalnya:

    cmake .. -DVCPKG_TARGET_ANDROID=ON -DANDROID_ABI=armeabi-v7a