Android
Триплеты x64-android, arm-neon-android и arm64-android тестируются в курируемом реестре vcpkg непрерывной интеграции.
Задайте переменную
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++, предназначенный для узла для любых зависимостей узлов.
Существует шесть разных 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, например 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.
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})
Документация и примеры папки /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_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, которая может изменяться или удаляться в любое время.
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" (см. ниже), требуются все четыре архитектуры. Если отсутствует экспорт, произойдет сбой.
Сначала выполните команду "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
См. пример репозитория GitHub здесь:
Отзыв о vcpkg
vcpkg — это проект с открытым исходным кодом. Выберите ссылку, чтобы оставить отзыв: