Android
I triplets x64-android, arm-neon-android e arm64-android vengono testati dall'integrazione continua del Registro di sistema curato da vcpkg.
Scaricare Android NDK
Impostare la variabile
ANDROID_NDK_HOME
di ambiente sull'installazione di Android NDK per configurare la toolchain Android. Ad esempio:export ANDROID_NDK_HOME=/home/your-account/Android/Sdk/ndk-bundle
Oppure:
export ANDROID_NDK_HOME=/home/your-account/Android/android-ndk-r26d
Nota: sarà comunque necessario installare g++ o un compilatore C++ destinato all'host per qualsiasi dipendenza host.
Ci sono sei diverse ABI Android, ognuna delle quali esegue il mapping a un triplo vcpkg. La tabella seguente illustra il mapping dalle architetture vcpkg alle architetture android:
VCPKG_TARGET_TRIPLET | ANDROID_ABI | ANDROID_ARM_NEON |
---|---|---|
arm64-android | arm64-v8a | |
arm-android | armeabi-v7a | OFF |
arm-neon-android | armeabi-v7a | In... |
x64-android | x86_64 | |
x86-android | x86 | |
armv6-android | armeabi |
È possibile compilare librerie Android, ad esempio jsoncpp
in un contenitore Docker Ubuntu.
Creare un Dockerfile
oggetto con il contenuto seguente:
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
Compilare l'immagine e avviare un nuovo contenitore:
docker build . -t "vcpkg-android"
docker run -it "vcpkg-android" bash
Nel contenitore creare /project/vcpkg.json
con il contenuto seguente:
{
"dependencies": [
"jsoncpp"
],
"builtin-baseline": "1e68748a7c6914642ed686b2e19c3d688bca150a"
}
Infine, eseguire vcpkg install --triplet x64-android
per compilare jsoncpp
per Android.
vcpkg include un vulkan
pacchetto che consente di .find_package(Vulkan)
Per usarlo, è necessario specificare la VULKAN_SDK
variabile di ambiente.
export VULKAN_SDK=/usr/local
./vcpkg install vulkan
NDK contiene già intestazioni e libvulkan.so
file binari Vulkan per ognuna delle relative architetture.
Per esporli a vcpkg, è possibile prendere in considerazione export VULKAN_SDK=...
per ogni installazione. Ma inserendo set(ENV{VULKAN_SDK} ...)
i file triplo, è possibile ignorare il lavoro noioso.
Se si usa NDK 21.3.6528147 o una versione precedente, sarà simile al seguente:
# 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)
Si noti che il percorso di sysroot è cambiato da NDK 22. Per altre informazioni, vedere [BUG] intestazioni sysroot mancanti da r22?).
Se si preferisce usare la versione più recente, controllare il BuildSystemMaintainers.md del documento NDK e quindi inserire il percorso appropriato per il sistema.
Ad esempio, gli utenti macOS useranno il percorso come nell'esempio seguente:
# 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)
In questo modo, per tutti i tripletti Android, è possibile installare vulkan
e i pacchetti che lo richiedono. (ad esempio 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 documentazione della cartella /examples/vcpkg_android_example_cmake fornisce un esempio funzionante, con una libreria Android che usa la libreria jsoncpp:
Il CMakeLists.txt usa
find_package
semplicemente etarget_link_library
Lo script compile.sh consente di selezionare qualsiasi coppia corrispondente di "android abi" / "vcpkg triplet" e di testare la compilazione
Il file fittizio my_lib.cpp usa la libreria jsoncpp
Nota
Questo esempio compila solo una libreria Android, perché la compilazione di un'app Android completa esula dall'ambito di questo documento.
Eseguire il test usando vcpkg_android.cmake.
La cartella vcpkg_android_example_cmake_script fornisce lo stesso esempio e usa uno script cmake per semplificare l'utilizzo.
Il CMakeLists.txt principale carica vcpkg_android.cmake se il flag
VCPKG_TARGET_ANDROID
è impostato:if (VCPKG_TARGET_ANDROID) include("cmake/vcpkg_android.cmake") endif()
Importante
Posizionare queste righe prima di chiamare
project()
.Lo script compile.sh mostra che è quindi possibile compilare per Android usando una semplice chiamata cmake, ad esempio:
cmake .. -DVCPKG_TARGET_ANDROID=ON -DANDROID_ABI=armeabi-v7a
Nota
Questa sezione illustra una funzionalità sperimentale di vcpkg che può cambiare o essere rimossa in qualsiasi momento.
vcpkg può esportare archivi Android (file AAR). Dopo aver creato un archivio, può essere importato in Android Studio come dipendente nativo. L'archivio viene utilizzato automaticamente usando lo strumento di prefab di Android Studio.
Per altre informazioni sul prefab, vedere:
- Documentazione ufficiale del prefab.
- un post di blog degli sviluppatori Android: Dipendenze native in Android Studio 4.0
Nota
Utenti di Android Studio: i pacchetti prefab sono supportati in Android Studio 4+.
ndk <required>
Impostare la variabile ANDROID_NDK_HOME
di ambiente sull'installazione di Android ndk. Ad esempio:
export ANDROID_NDK_HOME=/home/your-account/Android/Sdk/ndk-bundle
7zip <required on windows>
oppurezip <required on linux>
maven <optional>
Triplette Android
Nota
Per usare "prefab" (vedere di seguito), sono necessarie tutte e quattro le architetture. Se manca l'esportazione, l'esportazione avrà esito negativo.
Eseguire prima di tutto "vcpkg install" per tutte le architetture Android supportate (è obbligatorio esportarle tutte):
./vcpkg install jsoncpp:arm-android jsoncpp:arm64-android jsoncpp:x64-android jsoncpp:x86-android
Esportare quindi il prefab:
Note:
- Il
--prefab-maven
flag è facoltativo. Chiamalo se maven è installato. - Il
--prefab-debug
flag restituisce istruzioni su come usare l'archivio prefab tramite gradle.
./vcpkg export --triplet x64-android jsoncpp --prefab --prefab-maven --prefab-debug
Verrà visualizzato un output simile al seguente:
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
Vedere il repository GitHub di esempio qui:
Feedback su vcpkg
vcpkg è un progetto di open source. Selezionare un collegamento per fornire feedback: