Android
La integración continua del registro mantenido de vcpkg prueba los triplets x64-android, arm-neon-android y arm64-android.
Descarga del NDK de Android
Establezca la variable
ANDROID_NDK_HOME
de entorno en la instalación de NDK de Android para configurar la cadena de herramientas de Android. Por ejemplo:export ANDROID_NDK_HOME=/home/your-account/Android/Sdk/ndk-bundle
O:
export ANDROID_NDK_HOME=/home/your-account/Android/android-ndk-r26d
Nota: Todavía tendrá que instalar g++ o un compilador de C++ que tenga como destino el host para las dependencias del host.
Hay seis ABIs android diferentes, cada uno de los cuales se asigna a un triplete vcpkg. En la tabla siguiente se describe la asignación de arquitecturas vcpkg a arquitecturas android:
VCPKG_TARGET_TRIPLET | ANDROID_ABI | ANDROID_ARM_NEON |
---|---|---|
arm64-android | arm64-v8a | |
arm-android | armeabi-v7a | Apagado |
arm-neon-android | armeabi-v7a | ACTIVAR |
x64-android | x86_64 | |
x86-android | x86 | |
armv6-android | armeabi |
Puede compilar bibliotecas de Android, como jsoncpp
en un contenedor de Docker de Ubuntu.
Cree un Dockerfile
objeto con el siguiente contenido:
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
Compile la imagen e inicie un nuevo contenedor:
docker build . -t "vcpkg-android"
docker run -it "vcpkg-android" bash
En el contenedor, cree /project/vcpkg.json
con el siguiente contenido:
{
"dependencies": [
"jsoncpp"
],
"builtin-baseline": "1e68748a7c6914642ed686b2e19c3d688bca150a"
}
Por último, ejecute vcpkg install --triplet x64-android
para compilar jsoncpp
para Android.
vcpkg tiene un vulkan
paquete que le find_package(Vulkan)
permite . Para usarlo, debe proporcionar la variable de VULKAN_SDK
entorno.
export VULKAN_SDK=/usr/local
./vcpkg install vulkan
NDK ya contiene encabezados y libvulkan.so
archivos binarios de Vulkan para cada una de sus arquitecturas.
Para exponerlos a vcpkg, puede considerar export VULKAN_SDK=...
para cada instalación. Pero colocando set(ENV{VULKAN_SDK} ...)
en los archivos triples, puede omitir el trabajo tedioso.
Si usa NDK 21.3.6528147 o una versión anterior, será como la siguiente:
# 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)
Observe que la ubicación de sysroot ha cambiado desde NDK 22. (Para obtener más información, consulte [BUG] Faltan encabezados sysroot desde r22?).
Si prefiere usar la versión más reciente, compruebe la BuildSystemMaintainers.md del documento NDK y, a continuación, coloque la ruta de acceso adecuada para el sistema.
Por ejemplo, los usuarios de MacOS usarán la ruta de acceso como este ejemplo:
# 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)
Al hacerlo para todos los tripletes de Android, puede instalar vulkan
y los paquetes que lo requieren. (por ejemplo, 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})
La carpeta docs/examples/vcpkg_android_example_cmake proporciona un ejemplo de trabajo, con una biblioteca de Android que consume la biblioteca jsoncpp:
El CMakeLists.txt simplemente usa
find_package
ytarget_link_library
El script de compile.sh permite seleccionar cualquier par coincidente de "android abi" / "vcpkg triplet" y probar la compilación.
Nota
En este ejemplo solo se compila una biblioteca de Android, ya que la compilación de una aplicación android completa está fuera del ámbito de este documento.
Pruebe con vcpkg_android.cmake.
La carpeta vcpkg_android_example_cmake_script proporciona el mismo ejemplo y usa un script cmake para simplificar el uso.
El CMakeLists.txt principal carga vcpkg_android.cmake si se establece la marca
VCPKG_TARGET_ANDROID
:if (VCPKG_TARGET_ANDROID) include("cmake/vcpkg_android.cmake") endif()
Importante
Coloque estas líneas antes de llamar a
project()
.El script de compile.sh muestra que es posible compilar para Android mediante una invocación de cmake simple, por ejemplo:
cmake .. -DVCPKG_TARGET_ANDROID=ON -DANDROID_ABI=armeabi-v7a
Nota
En esta sección se describe una característica experimental de vcpkg que puede cambiar o quitarse en cualquier momento.
vcpkg puede exportar archivos de Android (archivos AAR). Una vez creado un archivo, se puede importar en Android Studio como dependiente nativo. El archivo se consume automáticamente mediante la herramienta prefabricada de Android Studio.
Para obtener más información sobre Prefab, consulte:
- Documentación oficial de objetos prefabricados.
- una entrada de blog de los desarrolladores de Android: Dependencias nativas en Android Studio 4.0
Nota
Usuarios de Android Studio: los paquetes prefabricados se admiten en Android Studio 4+.
ndk <required>
Establezca la variable de ANDROID_NDK_HOME
entorno en la instalación de android ndk. Por ejemplo:
export ANDROID_NDK_HOME=/home/your-account/Android/Sdk/ndk-bundle
7zip <required on windows>
ozip <required on linux>
maven <optional>
Tripletes de Android
Nota
Para usar "prefabricado" (consulte a continuación), se requieren las cuatro arquitecturas. Si falta alguna, se producirá un error en la exportación.
En primer lugar, ejecute "vcpkg install" para todas las arquitecturas android compatibles (es obligatorio exportar todas ellas):
./vcpkg install jsoncpp:arm-android jsoncpp:arm64-android jsoncpp:x64-android jsoncpp:x86-android
A continuación, exporte el objeto prefabricado:
Notas:
- La marca
--prefab-maven
es opcional. Llámalo si maven está instalado. - La
--prefab-debug
marca generará instrucciones sobre cómo usar el archivo prefabricado a través de gradle.
./vcpkg export --triplet x64-android jsoncpp --prefab --prefab-maven --prefab-debug
Verá una salida similar a la siguiente:
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
Consulte el repositorio de GitHub de ejemplo aquí:
Comentarios de vcpkg
vcpkg es un proyecto de código abierto. Seleccione un vínculo para proporcionar comentarios: