Android
Триплеты x64-android, arm-neon-android и arm64-android тестируются в курируемом реестре vcpkg непрерывной интеграции.
Требования к сборке Android
Задайте переменную
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 и соответствующие ABI Android
Существует шесть разных API Android, каждый из которых сопоставляется с vcpkg triplet. В следующей таблице описано сопоставление архитектур vcpkg с архитектурами Android:
VCPKG_TARGET_TRIPLET | ANDROID_ABI | ANDROID_ARM_NEON |
---|---|---|
arm64-android | arm64-v8a | |
arm-android | armeabi-v7a | ВЫКЛ. |
arm-neon-android | armeabi-v7a | DNS |
x64-android | x86_64 | |
x86-android | x86 | |
armv6-android | armeabi; |
Создание библиотек Android в контейнере Docker
Вы можете создавать библиотеки Android, например jsoncpp
в контейнере Docker Ubuntu.
Создайте следующее 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.
Использование пакета SDK Vulkan
vcpkg имеет vulkan
пакет , который позволяет вам find_package(Vulkan)
. Чтобы использовать его, необходимо предоставить VULKAN_SDK
переменную среды.
export VULKAN_SDK=/usr/local
./vcpkg install vulkan
NDK уже содержит заголовки и libvulkan.so
двоичные файлы Vulkan для каждой архитектуры.
Чтобы предоставить их 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)
Обратите внимание, что расположение sysroot изменилось с NDK 22. (Дополнительные сведения см. в разделе [ОШИБКА] заголовки sysroot отсутствуют с r22?).
Если вы предпочитаете использовать последнюю версию, проверьте BuildSystemMaintainers.md документа NDK и поместите соответствующий путь для системы.
Например, пользователи 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
Документация и примеры папки /vcpkg_android_example_cmake предоставляет рабочий пример с библиотекой Android, используюющей библиотеку jsoncpp:
Сведения
CMakeLists.txt просто использует
find_package
иtarget_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.cmake, если установлен флаг
VCPKG_TARGET_ANDROID
:if (VCPKG_TARGET_ANDROID) include("cmake/vcpkg_android.cmake") endif()
Внимание
Поместите эти строки перед вызовом
project()
.Скрипт compile.sh показывает, что затем можно скомпилировать для Android с помощью простого вызова cmake, например:
cmake .. -DVCPKG_TARGET_ANDROID=ON -DANDROID_ABI=armeabi-v7a
Использование библиотек с помощью vcpkg и предварительного архива Android (AAR-файлов)
Примечание.
В этом разделе рассматривается экспериментальная функция vcpkg, которая может изменяться или удаляться в любое время.
vcpkg может экспортировать архивы Android (AAR-файлы). После создания архива его можно импортировать в Android Studio как собственный зависимый. Архив автоматически используется с помощью средства предварительной проверки Android Studio.
Дополнительные сведения о prefab см. в следующем разделе:
- Официальная документация по подготовке.
- запись блога разработчиков Android: Собственные зависимости в Android Studio 4.0
Примечание.
Пользователи Android Studio: пакеты предварительной проверки поддерживаются в Android Studio 4+.
Требования
ndk <required>
Задайте переменную ANDROID_NDK_HOME
среды для установки android ndk. Например:
export ANDROID_NDK_HOME=/home/your-account/Android/Sdk/ndk-bundle
7zip <required on windows>
илиzip <required on linux>
maven <optional>
Триплеты Android
Примечание.
Чтобы использовать "prefab" (см. ниже), требуются все четыре архитектуры. Если отсутствует экспорт, произойдет сбой.
Пример экспорта [jsoncpp]
Сначала выполните команду "vcpkg install" для всех поддерживаемых архитектур Android (необходимо экспортировать все из них):
./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
Пример использования [jsoncpp] через vcpkg и prefab
См. пример репозитория GitHub здесь: