閱讀英文

共用方式為


Android

三胞胎 x64-android、arm-neon-android 和 arm64-android 是由 vcpkg 策劃的登錄持續整合測試。

Android 組建需求

  1. 下載 Android NDK

  2. 將環境變數 ANDROID_NDK_HOME 設定為 Android NDK 安裝,以設定 Android 工具鏈。 例如:

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

    或:

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

注意:您仍然需要安裝 g++ 或以任何主機相依性為目標的C++編譯程式。

vcpkg triplets 及其對應的Android ABI

有六個不同的Android API,每個都對應至 vcpkg triplet。 下表概述從 vcpkg 架構到 android 架構的對應:

VCPKG_TARGET_TRIPLET ANDROID_ABI ANDROID_ARM_NEON
arm64-android arm64-v8a
arm-android armeabi-v7a OFF
arm-neon-android armeabi-v7a ON
x64-android x86_64
x86-android x86
armv6-android armeabi

在 Docker 容器中建置 Android 連結庫

您可以建置 Android 連結庫,例如 jsoncpp 在 Ubuntu Docker 容器中。

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

建置映像並啟動新的容器:

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

在容器中,使用下列內容建立 /project/vcpkg.json

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

最後,執行 vcpkg install --triplet x64-android 以建置 jsoncpp android。

使用 Vulkan SDK

vcpkg 有一個 vulkan 套件 ,可讓您使用 find_package(Vulkan)。 若要使用它,您必須提供 VULKAN_SDK 環境變數。

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

NDK 已經包含 每個架構的 Vulkan 標頭和 libvulkan.so 二進位檔。

若要將其公開至 vcpkg,您可以針對每個安裝考慮 export VULKAN_SDK=... 。 但是,藉由將 放在 set(ENV{VULKAN_SDK} ...) 三重檔案中,您可以略過繁瑣的工作。

如果您使用 NDK 21.3.6528147 或較舊版本,則如下所示:

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

請注意, 自 NDK 22 以來,sysroot 的位置已變更。 (如需詳細資訊,請參閱 [BUG] 自 r22?以來遺漏的 sysroot 標頭。

如果您想要使用 最新版本,請檢查 NDK 檔案的 BuildSystemMaintainers.md,然後為您的系統放置適當的路徑。

例如,MacOS 使用者會使用如下範例的路徑:

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

您可以針對所有 Android 三胞胎執行這項操作,並安裝 vulkan 及需要它的套件。 (例如 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})

範例 Android 專案

資料夾 docs/examples/vcpkg_android_example_cmake提供可運作的範例,以及取用 jsoncpp 連結庫的 Android 連結庫:

詳細資料

  • CMakeLists.txt只會使用 find_packagetarget_link_library

  • compile.sh 腳本可讓您選取任何相符的 「android abi」 / “vcpkg triplet” 配對,並測試編譯

  • 虛擬 my_lib.cpp 檔案會使用 jsoncpp 連結庫

注意

此範例只會編譯 Android 連結庫,因為完整 Android 應用程式的編譯超出本檔的範圍。

在範例上測試: vcpkg_android.cmake

使用 vcpkg_android.cmake 進行測試。

資料夾vcpkg_android_example_cmake_script提供相同的範例,並使用 cmake 腳本來簡化使用方式。

詳細資料

  • 如果設定旗標,主要CMakeLists.txt會載入 vcpkg_android.cmakeVCPKG_TARGET_ANDROID

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

    重要

    在呼叫 project()之前放置這些行。

  • compile.sh 腳本顯示,接著可以使用簡單的 Cmake 調用來編譯 android,例如:

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

使用 vcpkg 和 Android 預製檔案取用連結庫 (AAR 檔案)

注意

本節涵蓋 vcpkg 的實驗功能,隨時可能會變更或移除。

vcpkg 可以導出 Android 封存(AAR 檔案)。 建立封存之後,就可以在Android Studio中匯入為原生相依專案。 封存會使用 Android Studio 的預製工具自動取用

如需 Prefab 的詳細資訊,請參閱:

注意

Android Studio 使用者:Android Studio 4+ 支持預製套件。

需求

  1. ndk <required>

將環境變數 ANDROID_NDK_HOME 設定為Android ndk 安裝。 例如:

export ANDROID_NDK_HOME=/home/your-account/Android/Sdk/ndk-bundle
  1. 7zip <required on windows>zip <required on linux>

  2. maven <optional>

  3. Android 三胞胎

注意

若要使用「預製專案」(請參閱下方),所有四個架構都是必要專案。 如果遺漏任何項目,匯出將會失敗。

匯出 [jsoncpp] 的範例

首先,針對所有支援的 Android 架構執行 「vcpkg install」(必須匯出所有架構):

./vcpkg install jsoncpp:arm-android  jsoncpp:arm64-android  jsoncpp:x64-android  jsoncpp:x86-android

然後,匯出預製專案:

注意:

  • --prefab-maven 標是選擇性的。 如果已安裝 maven,請呼叫它。
  • --prefab-debug 標會輸出如何透過 gradle 使用預製封存的指示。
./vcpkg export --triplet x64-android jsoncpp --prefab --prefab-maven --prefab-debug

您會看到如下的輸出:

The following packages are already built and will be exported:
    jsoncpp:arm64-android

Exporting package jsoncpp...
[DEBUG] Found 4 triplets
  arm64-android
  x64-android
  x86-android
  arm-android

...
... Lots of output...
...

[INFO] Scanning for projects...
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-clean-plugin/2.5/maven-clean-plugin-2.5.pom

...
... Lots of output...
...

[INFO] BUILD SUCCESS
[INFO] Total time:  2.207 s
[INFO] Finished at: 2020-05-10T14:42:28+02:00


...
... Lots of output...
...

[DEBUG] Configuration properties in Android Studio
In app/build.gradle

  com.vcpkg.ndk.support:jsoncpp:1.9.2

And cmake flags

    externalNativeBuild {
                cmake {
                    arguments '-DANDROID_STL=c++_shared'
                    cppFlags "-std=c++17"
                }
            }

In gradle.properties

    android.enablePrefab=true
    android.enableParallelJsonGen=false
    android.prefabVersion=${prefab.version}

Successfully exported jsoncpp. Checkout .../vcpkg/prefab 

匯出後的輸出目錄

prefab
└── jsoncpp/
    ├── aar/
    │   ├── AndroidManifest.xml
    │   ├── META-INF/
    │   │   └── LICENSE
    │   └── prefab/
    │       ├── modules/
    │       │   └── jsoncpp/
    │       │       ├── libs/
    │       │       │   ├── android.arm64-v8a/
    │       │       │   │   ├── abi.json
    │       │       │   │   ├── include/
    │       │       │   │   │   └── json/
    │       │       │   │   │       ├── json.h
    │       │       │   │   │       └── ....
    │       │       │   │   └── libjsoncpp.so
    │       │       │   ├── android.armeabi-v7a/
    │       │       │   │   ├── abi.json
    │       │       │   │   ├── include/
    │       │       │   │   │   └── json/
    │       │       │   │   │       ├── json.h
    │       │       │   │   │       └── ....
    │       │       │   │   └── libjsoncpp.so
    │       │       │   ├── android.x86/
    │       │       │   │   ├── abi.json
    │       │       │   │   ├── include/
    │       │       │   │   │   └── json/
    │       │       │   │   │       ├── json.h
    │       │       │   │   │       └── ....
    │       │       │   │   └── libjsoncpp.so
    │       │       │   └── android.x86_64/
    │       │       │       ├── abi.json
    │       │       │       ├── include/
    │       │       │       │   └── json/
    │       │       │       │       ├── json.h
    │       │       │       │       └── ....
    │       │       │       └── libjsoncpp.so
    │       │       └── module.json
    │       └── prefab.json
    ├── jsoncpp-1.9.2.aar
    └── pom.xml

透過 vcpkg 和 prefab 取用 [jsoncpp] 的範例

請參閱下列範例 GitHub 存放庫:

atkawa7/prefab-vpkg-integration-sample