İngilizce dilinde oku

Aracılığıyla paylaş


Android

x64-android, arm-neon-android ve arm64-android üçlüleri vcpkg'nin seçilmiş kayıt defteri sürekli tümleştirmesi tarafından test edilir.

Android derleme gereksinimleri

  1. Android NDK'yi indirme

  2. Android araç zincirini ayarlamak için ortam değişkenini ANDROID_NDK_HOME Android NDK yüklemenize ayarlayın. Örneğin:

    export ANDROID_NDK_HOME=/home/your-account/Android/Sdk/ndk-bundle
    

    Veya:

    export ANDROID_NDK_HOME=/home/your-account/Android/android-ndk-r26d
    

Not: Herhangi bir konak bağımlılıkları için ana bilgisayarınızı hedefleyen g++ veya C++ derleyicisi yüklemeniz gerekir.

vcpkg üçlüleri ve karşılık gelen Android ABI

Her biri bir vcpkg üçlüsünün eşlendiği altı farklı Android API'leri vardır. Aşağıdaki tabloda vcpkg mimarilerinden android mimarilerine eşleme özetlenmektedir:

VCPKG_TARGET_TRIPLET ANDROID_ABI ANDROID_ARM_NEON
arm64-android arm64-v8a
arm-android armeabi-v7a KAPALI
arm-neon-android armeabi-v7a AÇIK
x64-android x86_64
x86-android x86
armv6-android armeabi

Docker kapsayıcısında Android kitaplıkları oluşturma

Ubuntu Docker kapsayıcısı gibi jsoncpp Android kitaplıkları oluşturabilirsiniz.

Aşağıdaki içeriklerle bir Dockerfile oluşturun:

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örüntüyü derleyin ve yeni bir kapsayıcı başlatın:

docker build . -t "vcpkg-android"
docker run -it "vcpkg-android" bash

Kapsayıcıda aşağıdaki içeriklerle oluşturun /project/vcpkg.json :

{
  "dependencies": [
    "jsoncpp"
  ],
  "builtin-baseline": "1e68748a7c6914642ed686b2e19c3d688bca150a"
}

Son olarak, android için derlemek jsoncpp için komutunu çalıştırınvcpkg install --triplet x64-android.

Vulkan SDK'sı kullanma

vcpkg, 'ı kullanmanıza olanak tanıyan bir vulkan pakete find_package(Vulkan)sahiptir. Bunu kullanmak için ortam değişkenini VULKAN_SDK sağlamanız gerekir.

export VULKAN_SDK=/usr/local
./vcpkg install vulkan

NDK, mimarilerinin her biri için zaten Vulkan üst bilgileri ve libvulkan.so ikili dosyaları içeriyor.

Bunları vcpkg'de kullanıma açmak için her yükleme için göz önünde bulundurabilirsiniz export VULKAN_SDK=... . Ancak üçlü dosyaları yerleştirerek set(ENV{VULKAN_SDK} ...) sıkıcı işi atlayabilirsiniz.

NDK 21.3.6528147 veya önceki bir sürümü kullanıyorsanız, aşağıdaki gibi olacaktır:

# 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)

NDK 22'den bu yana sysroot konumunun değiştiğine dikkat edin. (Daha fazla bilgi için bkz. [HATA] r22'den bu yana sysroot üst bilgileri eksik).

En son sürümü kullanmayı tercih ediyorsanız, NDK belgesinin BuildSystemMaintainers.md denetleyin ve sisteminiz için uygun yolu koyun.

Örneğin, MacOS kullanıcıları şu örneğe benzer yolu kullanır:

# 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)

Bunu tüm Android üçlüleri için yaparak ve bunu gerektiren paketleri yükleyebilirsiniz vulkan . (örn. 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})

Örnek Android Projesi

docs/examples/vcpkg_android_example_cmake klasörü, jsoncpp kitaplığını kullanan bir Android kitaplığı ile çalışan bir örnek sağlar:

Ayrıntılar

  • CMakeLists.txt yalnızca ve kullanır find_packagetarget_link_library

  • compile.sh betiği eşleşen "android abi" / "vcpkg triplet" çiftini seçmenizi ve derlemeyi test etmenizi sağlar

  • Sahte my_lib.cpp dosyası jsoncpp kitaplığını kullanır

Not

Tam teşekküllü bir Android Uygulamasının derlemesi bu belgenin kapsamının dışında olduğundan, bu örnek yalnızca bir Android kitaplığını derler.

Bir örnekte test edin: vcpkg_android.cmake

vcpkg_android.cmake kullanarak test edin.

klasör vcpkg_android_example_cmake_script aynı örneği sağlar ve kullanımı basitleştirmek için bir cmake betiği kullanır.

Ayrıntılar

  • Bayrak VCPKG_TARGET_ANDROID ayarlandıysa ana CMakeLists.txt vcpkg_android.cmake'yi yükler:

    if (VCPKG_TARGET_ANDROID)
        include("cmake/vcpkg_android.cmake")
    endif()
    

    Önemli

    çağrısı project()öncesinde bu satırları yerleştirin.

  • compile.sh betiği, android için basit bir cmake çağrısı kullanarak derlemenin mümkün olduğunu gösterir, örneğin:

    cmake .. -DVCPKG_TARGET_ANDROID=ON -DANDROID_ABI=armeabi-v7a
    

vcpkg ve Android prefab Arşivleri (AAR dosyaları) kullanarak kitaplıkları kullanma

Not

Bu bölüm, vcpkg'nin herhangi bir zamanda değişebilen veya kaldırılabilen deneysel bir özelliğini kapsar.

vcpkg, Android arşivlerini (AAR dosyaları) dışarı aktarabilir. Arşiv oluşturulduktan sonra Android Studio'da yerel bağımlı olarak içeri aktarılabilir. Arşiv, Android Studio'nun prefabrik aracı kullanılarak otomatik olarak kullanılır.

Prefab hakkında daha fazla bilgi için bkz:

Not

Android Studio kullanıcıları: Prefab paketleri Android Studio 4+ üzerinde desteklenir.

Gereksinimler

  1. ndk <required>

Ortam değişkenini ANDROID_NDK_HOME android ndk yüklemenize ayarlayın. Örneğin:

export ANDROID_NDK_HOME=/home/your-account/Android/Sdk/ndk-bundle
  1. 7zip <required on windows> veya zip <required on linux>

  2. maven <optional>

  3. Android üçlüleri

Not

"Prefab" kullanmak için (aşağıya bakın), dört mimarinin tümü gereklidir. Eksik olan varsa dışarı aktarma başarısız olur.

Dışarı aktarma örneği [jsoncpp]

İlk olarak, desteklenen tüm Android mimarileri için "vcpkg yükleme" komutunu çalıştırın (tümünü dışarı aktarmak zorunludur):

./vcpkg install jsoncpp:arm-android  jsoncpp:arm64-android  jsoncpp:x64-android  jsoncpp:x86-android

Ardından, prefab'ı dışarı aktarın:

Notlar:

  • bayrağı --prefab-maven isteğe bağlıdır. Maven yüklüyse çağır.
  • Bayrağı, --prefab-debug gradle aracılığıyla prefabrik arşivin nasıl kullanılacağına ilişkin yönergelerin çıkışını oluşturur.
./vcpkg export --triplet x64-android jsoncpp --prefab --prefab-maven --prefab-debug

Aşağıdaki gibi bir çıkış görürsünüz:

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 

Dışarı aktarmadan sonra çıkış dizini

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

Vcpkg ve prefab aracılığıyla [jsoncpp] tüketen örnek

Buradaki örnek GitHub deposuna bakın:

atkawa7/prefab-vpkg-integration-sample