Android

Trojice x64-android, arm-neon-android a arm64-android jsou testovány kurátorovanou kontinuální integrací registru vcpkg.

Požadavky na sestavení pro Android

  1. Stažení sady Android NDK

  2. Nastavte proměnnou ANDROID_NDK_HOME prostředí na instalaci sady Android NDK a nastavte sadu nástrojů pro Android. Příklad:

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

    Nebo:

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

Poznámka: Stále budete muset nainstalovat g++ nebo kompilátor C++, který cílí na hostitele pro všechny závislosti hostitelů.

vcpkg triplets a jejich odpovídající Android ABI

Existuje šest různých rozhraní ABI pro Android, z nichž každá se mapuje na triplet vcpkg. Následující tabulka popisuje mapování z architektur vcpkg na architektury androidu:

VCPKG_TARGET_TRIPLET ANDROID_ABI ANDROID_ARM_NEON
arm64-android arm64-v8a
arm-android armeabi-v7a Vypnuto
arm-neon-android armeabi-v7a Zapnuto
x64-android x86_64
x86-android x86
armv6-android armeabi

Vytváření knihoven Androidu v kontejneru Dockeru

Můžete vytvářet knihovny Androidu, například jsoncpp v kontejneru Ubuntu Dockeru.

Vytvořte s následujícím obsahem Dockerfile :

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

Sestavte image a spusťte nový kontejner:

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

V kontejneru vytvořte /project/vcpkg.json následující obsah:

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

Nakonec spusťte vcpkg install --triplet x64-android sestavení jsoncpp pro Android.

Použití sady Sdk Sdk Služby

vcpkg má vulkan balíček , který vám find_package(Vulkan)umožní . Pokud ho chcete použít, musíte zadat proměnnou VULKAN_SDK prostředí.

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

Sada NDK už obsahuje libvulkan.so každou architekturu.

Pokud je chcete vystavit vcpkg, můžete zvážit export VULKAN_SDK=... pro každou instalaci. Ale umístěním set(ENV{VULKAN_SDK} ...) do trojitých souborů můžete přeskočit zdlouhavou práci.

Pokud používáte sadu NDK 21.3.6528147 nebo starší verzi, bude vypadat takto:

# 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)

Všimněte si, že umístění adresáře sysroot se od verze NDK 22 změnilo. (Další informace najdete v tématu [CHYBA] Chybí hlavičky sysroot od r22?).

Pokud dáváte přednost použití nejnovější verze, zkontrolujte BuildSystemMaintainers.md dokumentu NDK a poté vložte odpovídající cestu pro váš systém.

Uživatelé macOS například budou používat cestu jako v tomto příkladu:

# 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)

Když to uděláte pro všechny trojité sady Androidu, můžete nainstalovat vulkan a balíčky, které ho vyžadují. (např. vulkan-hpp)

'vcpkg install cluster-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})

Příklad projektu pro Android

Dokumentace ke složce / příklady/vcpkg_android_example_cmake poskytuje funkční příklad s knihovnou Pro Android, která využívá knihovnu jsoncpp:

Detaily

  • CMakeLists.txt jednoduše používá find_package atarget_link_library

  • Skript compile.sh umožňuje vybrat jakoukoli odpovídající dvojici "android abi" / "vcpkg triplet" a otestovat kompilaci.

  • Fiktivní my_lib.cpp soubor používá knihovnu jsoncpp.

Poznámka:

Tento příklad zkompiluje pouze knihovnu pro Android, protože kompilace plnohodnotné aplikace pro Android je nad rámec tohoto dokumentu.

Otestujte na příkladu: vcpkg_android.cmake

Otestujte použití vcpkg_android.cmake.

Složka vcpkg_android_example_cmake_script poskytuje stejný příklad a ke zjednodušení použití používá skript cmake.

Detaily

  • Hlavní CMakeLists.txt načte vcpkg_android.cmake, pokud je příznak VCPKG_TARGET_ANDROID nastaven:

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

    Důležité

    Před voláním project()umístěte tyto řádky .

  • Skript compile.sh ukazuje, že je pak možné zkompilovat pro Android pomocí jednoduchého vyvolání cmake, například:

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