영어로 읽기

다음을 통해 공유


Android

세 쌍둥이 x64-android, arm-neon-android 및 arm64-android는 vcpkg의 큐레이팅된 레지스트리 연속 통합에 의해 테스트됩니다.

Android 빌드 요구 사항

  1. Android NDK 다운로드

  2. Android 도구 체인을 설정하려면 환경 변수 ANDROID_NDK_HOME 를 Android NDK 설치로 설정합니다. 예시:

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

    또는

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

참고: 호스트 종속성을 대상으로 하는 g++ 또는 C++ 컴파일러를 설치해야 합니다.

vcpkg triplets 및 해당 Android ABI

각각 vcpkg 트리플렛에 매핑되는 6가지 Android API가 있습니다. 다음 표에서는 vcpkg 아키텍처에서 android 아키텍처로의 매핑을 간략하게 설명합니다.

VCPKG_TARGET_TRIPLET ANDROID_ABI ANDROID_ARM_NEON
arm64-android arm64-v8a
arm-android armeabi-v7a OFF
arm-neon-android armeabi-v7a ON
x64-android x86_64
x86-android x86
armv6-android armeabi

Docker 컨테이너에서 Android 라이브러리 빌드

Ubuntu Docker 컨테이너와 같은 jsoncpp Android 라이브러리를 빌드할 수 있습니다.

다음 내용을 사용하여 만듭니 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"
}

마지막으로 Android용 빌드 jsoncpp 를 실행 vcpkg install --triplet x64-android 합니다.

Vulkan SDK 사용

vcpkg에는 vulkan 사용자가 할 수 있는 패키지 가 있습니다 find_package(Vulkan). 이를 사용하려면 환경 변수를 VULKAN_SDK 제공해야 합니다.

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

NDK에는 각 아키텍처에 대한 Vulkan 헤더 및 libvulkan.so 이진 파일이 이미 포함되어 있습니다.

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)

NDK 22 이후 sysroot의 위치가 변경되었습니다. (자세한 내용은 를 참조하세요 .[BUG] sysroot 헤더가 r22 이후 누락되었나요?).

최신 버전을 사용하려는 경우 NDK 문서의 BuildSystemMaintainers.md 확인한 다음 시스템에 적절한 경로를 배치합니다.

예를 들어 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})

Android 프로젝트 예제

docs/examples/vcpkg_android_example_cmake 폴더는 jsoncpp 라이브러리를 사용하는 Android 라이브러리와 함께 작동하는 예제를 제공합니다.

세부 정보

  • CMakeLists.txt 단순히 사용하고 find_packagetarget_link_library

  • compile.sh 스크립트를 사용하면 일치하는 "android abi" / "vcpkg triplet" 쌍을 선택하고 컴파일을 테스트할 수 있습니다.

  • 더미 my_lib.cpp 파일은 jsoncpp 라이브러리를 사용합니다.

참고

이 예제에서는 본격적인 Android 앱의 컴파일이 이 문서의 범위를 벗어나기 때문에 Android 라이브러리만 컴파일합니다.

예제를 테스트합니다. vcpkg_android.cmake

vcpkg_android.cmake를 사용하여 테스트합니다.

vcpkg_android_example_cmake_script 폴더는 동일한 예제를 제공하며 사용을 간소화하기 위해 cmake 스크립트를 사용합니다.

세부 정보

  • 기본 CMakeLists.txt 플래그 VCPKG_TARGET_ANDROID 가 설정된 경우 vcpkg_android.cmake를 로드합니다.

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

    중요

    다음 줄을 호출 project()하기 전에 배치합니다.

  • compile.sh 스크립트는 간단한 cmake 호출을 사용하여 android용으로 컴파일할 수 있음을 보여 줍니다. 예를 들면 다음과 같습니다.

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

vcpkg 및 Android 프리팹 보관 파일(AAR 파일)을 사용하여 라이브러리 사용

참고

이 섹션에서는 언제든지 변경하거나 제거할 수 있는 vcpkg의 실험적 기능에 대해 설명합니다.

vcpkg는 Android 보관 파일(AAR 파일)을 내보낼 수 있습니다. 보관이 만들어지면 Android Studio에서 네이티브 종속으로 가져올 수 있습니다. 보관 파일은 Android Studio의 프리팹 도구를 사용하여 자동으로 소비됩니다.

Prefab에 대한 자세한 내용은 다음을 참조하세요.

참고

Android Studio 사용자: 프리팹 패키지는 Android Studio 4 이상에서 지원됩니다.

요구 사항

  1. ndk <required>

환경 변수 ANDROID_NDK_HOME 를 Android ndk 설치로 설정합니다. 예시:

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

  2. maven <optional>

  3. Android 트리플렛

참고

"prefab"(아래 참조)을 사용하려면 네 가지 아키텍처가 모두 필요합니다. 누락된 항목이 있으면 내보내기가 실패합니다.

내보내기 예제 [jsoncpp]

먼저 지원되는 모든 Android 아키텍처에 대해 "vcpkg install"을 실행합니다(모든 아키텍처를 내보내는 것이 필수).

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

그런 다음, 프리팹을 내보냅니다.

참고:

  • --prefab-maven 플래그는 선택 사항입니다. maven이 설치된 경우 호출합니다.
  • 플래그는 --prefab-debug 그라데이션을 통해 프리팹 아카이브를 사용하는 방법에 대한 지침을 출력합니다.
./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

vcpkg 및 prefab을 통해 [jsoncpp]를 사용하는 예제

여기서 예제 GitHub 리포지토리를 참조하세요.

atkawa7/prefab-vpkg-integration-sample