Android
Les triplets x64-android, arm-neon-android et arm64-android sont testés par l’intégration continue du registre organisé de vcpkg.
Télécharger le NDK Android
Définissez la variable
ANDROID_NDK_HOME
d’environnement sur votre installation android NDK pour configurer la chaîne d’outils Android. Par exemple :export ANDROID_NDK_HOME=/home/your-account/Android/Sdk/ndk-bundle
Ou :
export ANDROID_NDK_HOME=/home/your-account/Android/android-ndk-r26d
Remarque : vous devez toujours installer g++ ou un compilateur C++ qui cible votre hôte pour toutes les dépendances de l’hôte.
Il existe six API Android différentes, chacune étant mappée à un triplet vcpkg. Le tableau suivant décrit le mappage des architectures vcpkg aux architectures Android :
VCPKG_TARGET_TRIPLET | ANDROID_ABI | ANDROID_ARM_NEON |
---|---|---|
arm64-android | arm64-v8a | |
arm-android | armeabi-v7a | OFF |
arm-neon-android | armeabi-v7a | ACTIVÉ |
x64-android | x86_64 | |
x86-android | x86 | |
armv6-android | armeabi |
Vous pouvez créer des bibliothèques Android, comme jsoncpp
dans un conteneur Docker Ubuntu.
Créez un Dockerfile
contenu avec les éléments suivants :
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
Générez l’image et lancez un nouveau conteneur :
docker build . -t "vcpkg-android"
docker run -it "vcpkg-android" bash
Dans le conteneur, créez /project/vcpkg.json
avec le contenu suivant :
{
"dependencies": [
"jsoncpp"
],
"builtin-baseline": "1e68748a7c6914642ed686b2e19c3d688bca150a"
}
Enfin, exécutez vcpkg install --triplet x64-android
pour générer jsoncpp
pour Android.
vcpkg a un vulkan
package qui vous find_package(Vulkan)
permet de . Pour l’utiliser, vous devez fournir la variable d’environnement VULKAN_SDK
.
export VULKAN_SDK=/usr/local
./vcpkg install vulkan
NDK contient déjà des en-têtes et libvulkan.so
des fichiers binaires Vulkan pour chacune de ses architectures.
Pour les exposer à vcpkg, vous pouvez envisager export VULKAN_SDK=...
pour chaque installation. Mais en plaçant set(ENV{VULKAN_SDK} ...)
les fichiers triplets, vous pouvez ignorer le travail fastidieux.
Si vous utilisez NDK 21.3.6528147 ou une version antérieure, ce sera comme suit :
# 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)
Notez que l’emplacement du sysroot a changé depuis NDK 22. (Pour plus d’informations, consultez [BUG] en-têtes sysroot manquants depuis r22 ?).
Si vous préférez utiliser la dernière version, vérifiez la BuildSystemMaintainers.md du document NDK, puis placez le chemin approprié pour votre système.
Par exemple, les utilisateurs macOS utilisent le chemin d’accès comme cet exemple :
# 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)
En procédant ainsi pour tous les triplets Android, vous pouvez installer vulkan
et les packages qui en ont besoin. (p. ex. 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})
Le dossier docs/examples/vcpkg_android_example_cmake fournit un exemple de travail, avec une bibliothèque Android qui consomme la bibliothèque jsoncpp :
Le CMakeLists.txt utilise
find_package
simplement ettarget_link_library
Le script compile.sh vous permet de sélectionner n’importe quelle paire correspondante de « android abi » / « vcpkg triplet » et de tester la compilation
Le fichier my_lib.cpp factice utilise la bibliothèque jsoncpp
Notes
Cet exemple compile uniquement une bibliothèque Android, car la compilation d’une application Android à part entière dépasse la portée de ce document.
Testez l’utilisation de vcpkg_android.cmake.
Le dossier vcpkg_android_example_cmake_script fournit le même exemple et utilise un script cmake pour simplifier l’utilisation.
La CMakeLists.txt principale charge vcpkg_android.cmake si l’indicateur
VCPKG_TARGET_ANDROID
est défini :if (VCPKG_TARGET_ANDROID) include("cmake/vcpkg_android.cmake") endif()
Important
Placez ces lignes avant d’appeler
project()
.Le script compile.sh montre qu’il est ensuite possible de compiler pour Android à l’aide d’un appel cmake simple, par exemple :
cmake .. -DVCPKG_TARGET_ANDROID=ON -DANDROID_ABI=armeabi-v7a
Notes
Cette section décrit une fonctionnalité expérimentale de vcpkg qui peut changer ou être supprimée à tout moment.
vcpkg peut exporter des archives Android (fichiers AAR). Une fois qu’une archive est créée, elle peut être importée dans Android Studio en tant que dépendante native. L’archive est consommée automatiquement à l’aide de l’outil préfabriqué d’Android Studio.
Pour plus d’informations sur Prefab, consultez :
- Documentation officielle du préfabriqué.
- un billet de blog des développeurs Android : Dépendances natives dans Android Studio 4.0
Notes
Utilisateurs d’Android Studio : les packages préfabriqués sont pris en charge sur Android Studio 4+.
ndk <required>
Définissez la variable ANDROID_NDK_HOME
d’environnement sur votre installation android ndk. Par exemple :
export ANDROID_NDK_HOME=/home/your-account/Android/Sdk/ndk-bundle
7zip <required on windows>
ouzip <required on linux>
maven <optional>
Triplets Android
Notes
Pour utiliser « prefab » (voir ci-dessous), les quatre architectures sont requises. Si l’exportation est manquante, l’exportation échoue.
Tout d’abord, exécutez « vcpkg install » pour toutes les architectures Android prises en charge (il est obligatoire d’exporter toutes ces architectures) :
./vcpkg install jsoncpp:arm-android jsoncpp:arm64-android jsoncpp:x64-android jsoncpp:x86-android
Ensuite, exportez le préfabriqué :
Remarques :
- L'indicateur
--prefab-maven
est facultatif. Appelez-le si maven est installé. - L’indicateur
--prefab-debug
génère des instructions sur l’utilisation de l’archive préfabriquée via gradle.
./vcpkg export --triplet x64-android jsoncpp --prefab --prefab-maven --prefab-debug
Vous verrez la sortie comme suit :
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
Consultez l’exemple de dépôt GitHub ici :
Commentaires sur vcpkg
vcpkg est un projet open source. Sélectionnez un lien pour fournir des commentaires :