CMarka

Android NDK, uygulamanız için C ve C++ kodunu derlemek üzere CMake'ı kullanmayı destekler. Bu sayfada, Android Gradle eklentisi ExternalNativeBuild aracılığıyla veya doğrudan CMake'i çağırırken NDK ile CMake'in nasıl kullanılacağı açıklanmaktadır.

CMake araç zinciri dosyası

NDK, araç zinciri dosyası aracılığıyla CMake'i destekler. Araç zinciri dosyaları, çapraz derleme için araç zincirinin davranışını özelleştiren CMake dosyalarıdır. NDK için kullanılan araç zinciri dosyası, NDK'da <NDK>/build/cmake/android.toolchain.cmake adresinde bulunur.

cmake çağrılırken komut satırında ABI, minSdkVersion gibi derleme parametreleri verilir. Desteklenen bağımsız değişkenlerin listesi için Araç zinciri bağımsız değişkenleri bölümüne bakın.

Kullanım

Gradle

externalNativeBuild kullanılırken CMake araç zinciri dosyası otomatik olarak kullanılır. Daha fazla bilgi için Android Studio'nun Projenize C ve C++ kodunu ekleme kılavuzuna bakın.

Komut Satırı

Gradle dışında CMake ile derleme yaparken araç zinciri dosyasının kendisi ve bağımsız değişkenleri CMake'e iletilmelidir. Örneğin:

$ cmake \
    -DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake \
    -DANDROID_ABI=$ABI \
    -DANDROID_PLATFORM=android-$MINSDKVERSION \
    $OTHER_ARGS

Araç zinciri bağımsız değişkenleri

Aşağıdaki bağımsız değişkenler CMake toolchain dosyasına aktarılabilir. Gradle ile derliyorsanız ExternalNativeBuild belgelerinde açıklandığı şekilde android.defaultConfig.externalNativeBuild.cmake.arguments öğesine bağımsız değişkenler ekleyin. Komut satırından derliyorsanız bağımsız değişkenleri -D ile CMake'e iletin. Örneğin, armeabi-v7a'yı her zaman Neon desteğiyle derlemeye zorlamak için -DANDROID_ARM_NEON=TRUE değerini geçirin.

ANDROID_ABI

Hedef ABI. Desteklenen ABI'ler hakkında bilgi için Android ABI'leri konusuna bakın.

Gradle

Gradle bu bağımsız değişkeni otomatik olarak sağlar. Bu bağımsız değişkeni build.gradle dosyanızda açıkça belirtmeyin. ABI'ler Gradle'ın neleri hedeflediğini kontrol etmek için Android ABI'leri bölümünde açıklandığı gibi abiFilters kullanın.

Komut Satırı

CMake, derleme başına tek bir hedef için derleme yapar. Birden fazla Android ABI'yi hedeflemek için ABI başına bir kez derlemeniz gerekir. Derlemeler arasında çakışmaları önlemek amacıyla her ABI için farklı derleme dizinleri kullanılması önerilir.

Değer Notlar
armeabi-v7a
armeabi-v7a with NEON -DANDROID_ABI=armeabi-v7a -DANDROID_ARM_NEON=ON ile aynı.
arm64-v8a
x86
x86_64

ANDROID_ARM_MODE

armeabi-v7a için kol talimatlarının mı yoksa baş parmak talimatlarının mı oluşturulacağını belirtir. Diğer ABI'ler için bir etkisi yoktur. Daha fazla bilgi için Android ABI'leri belgelerine bakın.

Değer Notlar
etkinleştir
baş parmak Varsayılan davranış.

ANDROID_ARM_NEON

Armeabi-v7a için NEON'u etkinleştirir veya devre dışı bırakır. Diğer ABI'ler için bir etkisi yoktur. API düzeyi (minSdkVersion veya ANDROID_PLATFORM) 23 veya daha yeni sürümleri için varsayılan olarak true (doğru), aksi takdirde false (yanlış) değerine ayarlanır. Daha fazla bilgi için Neon desteği dokümanlarına bakın.

Değer Notlar
DOĞRU API düzeyi 23 veya sonraki sürümler için varsayılandır.
YANLIŞ API düzeyi 22 veya üstü için varsayılandır.

ANDROID_LD

Hangi bağlayıcının kullanılacağını seçer. lld, şu anda NDK için deneyseldir ve bu bağımsız değişkenle etkinleştirilebilir.

Değer Notlar
Ld lld'yi etkinleştirir.
varsayılan Belirtilen ABI için varsayılan bağlayıcıyı kullanın.

ANDROID_NATIVE_API_LEVEL

ANDROID_PLATFORM takma adı.

ANDROID_PLATFORM

Uygulama veya kitaplık tarafından desteklenen minimum API düzeyini belirtir. Bu değer, uygulamanın minSdkVersion değerine karşılık gelir.

Gradle

Android Gradle Eklentisi kullanılırken bu değer, uygulamanın minSdkVersion ile eşleşecek şekilde otomatik olarak ayarlanır ve manuel olarak ayarlanmamalıdır.

Komut Satırı

CMake'i doğrudan çağırırken bu değer varsayılan olarak, kullanımda olan NDK tarafından desteklenen en düşük API seviyesine ayarlanır. Örneğin, NDK r20'de bu değer varsayılan olarak API düzeyi 16'ya ayarlanır.

Bu parametre için birden fazla biçim kabul edilir:

  • android-$API_LEVEL
  • $API_LEVEL
  • android-$API_LETTER

$API_LETTER biçimi, bu sürümle ilişkilendirilen sayıyı belirlemenize gerek kalmadan android-N öğesini belirtmenize olanak tanır. Bazı sürümlerin, harf artışı olmadan API artışı aldığını unutmayın. Bu API'ler, -MR1 son ekinin eklenmesiyle belirtilebilir. Örneğin, API düzeyi 25, android-N-MR1'dir.

ANDROID_STL

Bu uygulama için hangi STL'nin kullanılacağını belirtir. Daha fazla bilgi için C++ kitaplık desteği bölümünü inceleyin. Varsayılan olarak c++_static kullanılır.

Değer Notlar
c++_paylaşılan libc++'nın paylaşılan kitaplık varyantı.
c++_statik libc++ statik kitaplık varyantı.
yok C++ standart kitaplık desteği yoktur.
sistem Sistem STL

CMake derleme komutunu anlama

CMake derleme sorunlarında hata ayıklarken Gradle'ın Android için çapraz derleme yaparken kullandığı belirli derleme bağımsız değişkenlerini bilmek faydalıdır.

Android Gradle Eklentisi, build_command.txt ile her ABI ve derleme türü çifti için CMake derlemesi yürütmek amacıyla kullandığı derleme bağımsız değişkenlerini kaydeder. Bu dosyalar aşağıdaki dizinde bulunur:

<project-root>/<module-root>/.cxx/cmake/<build-type>/<ABI>/

Aşağıdaki snippet'te, armeabi-v7a mimarisini hedefleyen hello-jni örneğinin hata ayıklanabilir bir sürümünü oluşturmak için CMake bağımsız değişkenlerinin bir örneği gösterilmektedir.

                    Executable : ${HOME}/Android/Sdk/cmake/3.10.2.4988404/bin/cmake
arguments :
-H${HOME}/Dev/github-projects/googlesamples/ndk-samples/hello-jni/app/src/main/cpp
-DCMAKE_FIND_ROOT_PATH=${HOME}/Dev/github-projects/googlesamples/ndk-samples/hello-jni/app/.cxx/cmake/universalDebug/prefab/armeabi-v7a/prefab
-DCMAKE_BUILD_TYPE=Debug
-DCMAKE_TOOLCHAIN_FILE=${HOME}/Android/Sdk/ndk/22.1.7171670/build/cmake/android.toolchain.cmake
-DANDROID_ABI=armeabi-v7a
-DANDROID_NDK=${HOME}/Android/Sdk/ndk/22.1.7171670
-DANDROID_PLATFORM=android-23
-DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a
-DCMAKE_ANDROID_NDK=${HOME}/Android/Sdk/ndk/22.1.7171670
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON
-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=${HOME}/Dev/github-projects/googlesamples/ndk-samples/hello-jni/app/build/intermediates/cmake/universalDebug/obj/armeabi-v7a
-DCMAKE_RUNTIME_OUTPUT_DIRECTORY=${HOME}/Dev/github-projects/googlesamples/ndk-samples/hello-jni/app/build/intermediates/cmake/universalDebug/obj/armeabi-v7a
-DCMAKE_MAKE_PROGRAM=${HOME}/Android/Sdk/cmake/3.10.2.4988404/bin/ninja
-DCMAKE_SYSTEM_NAME=Android
-DCMAKE_SYSTEM_VERSION=23
-B${HOME}/Dev/github-projects/googlesamples/ndk-samples/hello-jni/app/.cxx/cmake/universalDebug/armeabi-v7a
-GNinja
jvmArgs :


                    Build command args: []
                    Version: 1

Önceden oluşturulmuş kitaplıkları kullanma

İçe aktarmanız gereken önceden oluşturulmuş kitaplık bir AAR olarak dağıtılmışsa bunları içe aktarmak ve kullanmak için Studio'nun bağımlılık belgelerini izleyin. AGP kullanmıyorsanız https://google.github.io/prefab/example-workflow.html adresindeki adımları izleyebilirsiniz. Ancak AGP'ye geçiş yapmak muhtemelen çok daha kolaydır.

AAR olarak dağıtılmayan kitaplıklar için önceden oluşturulmuş kitaplıkları CMake ile kullanmaya ilişkin talimatları CMake kılavuzundaki IMPORTED hedefleriyle ilgili add_library belgelerine bakın.

Üçüncü taraf kodu oluşturma

CMake projenizin parçası olarak üçüncü taraf kodu derlemenin çeşitli yolları vardır ve hangi seçeneğin en iyi sonucu sağlayacağı, durumunuza bağlı olarak değişir. Genellikle en iyi seçenek bunu hiç yapmamaktır. Bunun yerine, kitaplık için bir AAR oluşturup uygulamanızda kullanın. Bu AAR'yi yayınlamanız gerekmez. Gradle projenizin içinde olabilir.

Bu bir seçenek değilse:

  • Üçüncü taraf kaynağı deponuza aktarın (ör. kopyalayın) ve oluşturmak için add_subdirectory kullanın. Bu, yalnızca diğer kitaplık da CMake ile oluşturulduğunda işe yarar.
  • ExternalProject tanımlayın.
  • Kitaplığı projenizden ayrı olarak oluşturun ve önceden oluşturulmuş olarak içe aktarmak için Önceden oluşturulmuş kitaplıkları kullanma talimatlarını uygulayın.

CMake'de YASM desteği

NDK, x86 ve x86-64 mimarilerinde çalışacak YASM ile yazılmış derleme kodu derleme konusunda CMake desteği sağlar. YASM, NASM derleyicisine dayalı olarak x86 ve x86-64 mimarileri için açık kaynaklı bir derleyicidir.

CMake ile derleme kodu oluşturmak için projenizin CMakeLists.txt bölümünde aşağıdaki değişiklikleri yapın:

  1. enable_language adlı aracı, değeri ASM_NASM olarak ayarlanmış şekilde çağırın.
  2. Paylaşılan kitaplık veya yürütülebilir ikili program oluşturmanıza bağlı olarak add_library veya add_executable yöntemini çağırın. Bağımsız değişkenlerde, YASM'deki derleme programı için .asm dosyalarından ve ilişkili C kitaplıkları veya işlevler için .c dosyalarından oluşan kaynak dosyaları listesini iletin.

Aşağıdaki snippet'te, paylaşılan kitaplık olarak bir YASM programı oluşturmak için CMakeLists.txt öğenizi nasıl yapılandırabileceğiniz gösterilmektedir.

cmake_minimum_required(VERSION 3.6.0)

enable_language(ASM_NASM)

add_library(test-yasm SHARED jni/test-yasm.c jni/print_hello.asm)

Yürütülebilir dosya olarak YASM programının nasıl derleneceğine dair örnek için NDK git deposundaki yasm testi'ne bakın.

Sorun bildirme

NDK veya CMake toolchain dosyasıyla ilgili herhangi bir sorunla karşılaşırsanız bunları GitHub'daki android-ndk/ndk sorun izleyicisi aracılığıyla bildirin. Gradle veya Android Gradle Eklentisi ile ilgili sorunlar için bunun yerine Studio hatası bildirin.