CMake

Android NDK, aşağıdaki işlemlerde CMake'in kullanılmasını destekler: uygulamanız için C ve C++ kodunu derleyin. Bu sayfada, Android Gradle Eklentisinin ExternalNativeBuild öğesini kullanarak veya CMake'i doğrudan çağırmanız gerekir.

CMake araç zinciri dosyası

NDK, CMake'i bir araç zinciri dosyası aracılığıyla destekler. Araç zinciri dosyaları CMake dosyalarıdır özelliğini özelleştirebilirsiniz. Araç zinciri NDK için kullanılan dosya <NDK>/build/cmake/android.toolchain.cmake

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

"Yeni" araç zinciri dosyası

Daha önce NDK'lar, Virtual Verde için Google Analytics 4'te sunulan araç zinciri dosyasının NDK'nın araç zinciri dosyasının kullanılması ile NDK'nın araç zinciri dosyasının kullanılması ile yerleşik CMake desteğini kullanarak. Bu da 1900'lü yılların başlangıcında henüz tamamlanmamış olan ama davranışı iyileştirmeyen bir çalışmada Dolayısıyla artık bunun takibini yapmıyoruz.

"Yeni" araç zinciri dosyasında "eski" ile karşılaştırıldığında davranış regresyonları var araç zinciri dosyasına göz atın. Varsayılan davranış, önerilen iş akışıdır. Eğer -DANDROID_USE_LEGACY_TOOLCHAIN_FILE=OFF kullanarak bu işareti kaldırmanızı öneririz kaldırın. Yeni araç zinciri dosyası, eski sürümle araç zinciri dosyası oluşturarak devam eder, bu nedenle davranış regresyonları olabilir.

Yeni araç zinciri dosyasının kullanılmasını önersek de şu anda NDK'dan kaldırmayı planlıyor. Bu, şuna dayanan yapıları bozar: yeni ve eski araç zinciri dosyaları arasındaki davranış farklılıkları ve bu seçenek, "eski" ve "yeni" seçeneğinizin aslında bu seçeneği kullanan kullanıcıları da olumsuz etkiler. yüklemeniz gerekmeyecek yeni bir araç zinciri dosyası oluşturun, ancak yeni araç zinciri dosyası davranışı muhtemelen düzeltilmeyecektir ve yapmanız gerekir.

Kullanım

Gradle

CMake araç zinciri dosyası, externalNativeBuild Android Studio'nun C ve C++ kodunu proje rehberini inceleyin.

Komut Satırı

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

$ 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 araç zinciri dosyasına aktarılabilir. Bina yapılıyorsa eklemek için android.defaultConfig.externalNativeBuild.cmake.arguments ExternalNativeBuild belgeleri. Komut satırından oluşturuyorsanız bağımsız değişkenleri -D ile içerik oluşturun. Örneğin, armeabi-v7a'yı Neon ile inşa etmemeye zorlamak için desteği, -DANDROID_ARM_NEON=FALSE geçin.

ANDROID_ABI

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

Gradle

Gradle, bu bağımsız değişkeni otomatik olarak sağlar. Bunu açıkça ayarlamayın bağımsız değişkeni build.gradle dosyanıza ekleyin. ABI'lerin hangi hedefleri hedeflediğini kontrol etmek için: abiFilters öğesini Android ABI'leri bölümünde açıklandığı şekilde kullanın.

Komut Satırı

Derleme başına tek bir hedef için derlemeler oluşturun. Birden fazla Android'i hedeflemek için ABI her ABI için bir kez derleme yapmanız gerekir. Farklı derlemeler kullanmanız önerilir dizinleri oluşturun.

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

ANDROID_ARM_MODE

armeabi-v7a için kol veya baş parmak talimatlarının oluşturulup oluşturulmayacağını belirtir. Hayır etkisine neden olur. Daha fazla bilgi için Android ABI'leri bölümüne bakın. belgelerinden faydalanabilirsiniz.

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

ANDROID_NATIVE_API_LEVEL

ANDROID_PLATFORM için takma ad.

ANDROID_PLATFORM

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

Gradle

Android Gradle eklentisi kullanılırken bu değer otomatik olarak şuna ayarlanır: uygulamanın minSdkVersion ile eşleştiğinden manuel olarak ayarlanmamalıdır.

Komut Satırı

CMake doğrudan çağrılırken bu değer varsayılan olarak en düşük API düzeyine ayarlanır kullanımdaki NDK tarafından desteklenmektedir. Örneğin, NDK r20 için bu değer varsayılan olarak API düzeyi 16'ya yükseltin.

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

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

$API_LETTER biçimi, gerek kalmadan android-N öğesini belirtmenize olanak tanır. o yayınla ilişkili numarayı belirler. Bazı sürümlerde harf artışı olmadan API artışı aldı. Bu API'ler belirtilebilir -MR1 son ekini ekleyerek. Ö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 bkz. C++ destek ile görüşün. 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++'nın statik kitaplık varyantı.
yok C++ standart kitaplık desteği yoktur.
sistem Sistem STL'si

Derleyici işaretlerini yönet

Derlemeniz için derleyiciye veya bağlayıcıya belirli işaretleri iletmeniz gerekiyorsa set_target_summary_options için CMake dokümanlarına bakın ve alakalı seçenekler içerir. "Şuna da bakabilirsiniz:" bu sayfanın alt kısmındaki birkaç ipucu vereceğim.

Genel olarak en iyi uygulama, derleyici işaretlerini en dar kapsam dışı görülür. Tüm hedeflerinize uygulamak istediğiniz işaretler (ör. -Werror) modül başına tekrarlanması uygun değildir, ancak yine de nadiren genel olarak uygulanır (CMAKE_CXX_FLAGS). Bunun nedeni, bu politikaların ve üçüncü taraf bağımlılıklarını belirlemenize yardımcı olur. Bu gibi durumlarda flag'ler dizin kapsamında (add_compile_options) uygulandı.

Dar bir derleyici işareti alt kümesi için bunlar ayrıca build.gradle dosyanızda da ayarlanabilir cppFlags veya benzer özellikleri kullanarak dosyanız için bir kod oluşturun. Bunu yapmamalısınız. Bayraklar CMake'in Gradle'dan CMake'e aktarılması şaşırtıcı öncelikli davranışlara önceden ayarlanmış, uygulama tarafından dolaylı olarak iletilen işaretleri geçersiz Android kodu oluşturmak için gereklidir. Her zaman CMake davranışını yönetmeyi tercih et doğrudan CMake'de bulabilirsiniz. Derleyici işaretlerini AGP buildType bazında kontrol etmeniz gerekiyorsa CMake'de AGP derleme türleriyle çalışma başlıklı makaleyi inceleyin.

CMake'de AGP derleme türleriyle çalışma

CMake davranışını özel bir Gradle buildType'a uyarlamanız gerekiyorsa şunu kullanın: derlemek için kullandığınız ek bir CMake işareti (derleyici işareti değil) CMake komut dosyalarını okuyabilir. Örneğin, ve "premium" derleme.gradle.kts dosyanız tarafından kontrol edilen varyantlar derlerseniz ve CMake'e ileteceksiniz:

android {
    buildTypes {
        free {
            externalNativeBuild {
                cmake {
                    arguments.add("-DPRODUCT_VARIANT_PREMIUM=OFF")
                }
            }
        }
        premium {
            externalNativeBuild {
                cmake {
                    arguments.add("-DPRODUCT_VARIANT_PREMIUM=ON")
                }
            }
        }
    }
}

Ardından, CMakeLists.txt dosyanızda:

if (DPRODUCT_VARIANT_PREMIUM)
  # Do stuff for the premium build.
else()
  # Do stuff for the free build.
endif()

Değişkenin adı size bağlıdır, ancak ile çakışmayı veya karışıklığı önlemek için ANDROID_, APP_ veya CMAKE_ öneki kullanın.

Örnek için Sanitizers NDK örneğine bakın.

CMake derleme komutunu anlama

CMake derleme sorunlarında hata ayıklarken belirli derlemeyi bilmek faydalı bağımsız değişkenlerine değineceğiz.

Android Gradle Eklentisi bir dosyayı çalıştırmak için kullandığı derleme bağımsız değişkenlerini kaydeder Her ABI ve derleme türü için CMake derlemesi build_command.txt ile eşle. Bu dosyalar şu konumlarda bulunur: dizin:

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

Aşağıdaki snippet, armeabi-v7a hedefleyen hello-jni örneğinin hata ayıklanabilir sürümü bahsedeceğim.

                    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ı kullanın

İçe aktarmanız gereken önceden oluşturulmuş kitaplık AAR olarak dağıtılıyorsa Studio'nun bağımlılık belgeleri içe aktarıp kullanabilirsiniz. AGP kullanmıyorsanız https://google.github.io/prefab/example-workflow.html, ancak AGP'ye geçiş daha kolaydır.

AAR olarak dağıtılmayan kitaplıklar için önceden oluşturulmuş kütüphaneler için IMPORTED ile ilgili add_library dokümanlarına bakın CMake kılavuzu'ndaki hedefler.

Üçüncü taraf kodu oluşturma

CMake kapsamında üçüncü taraf kod oluşturmanın çeşitli yolları vardır ve hangi seçeneğin en çok işe yaradığını durumunuza göre değişir. En iyi seçeneği çoğu zaman bunu hiç yapmamaktır. Bunun yerine uygulamanızda kullanabilirsiniz. Proje başlatma belgenizi yayınlayın. Gradle projenizin içinde olabilir.

Bu mümkün değilse:

CMake'de YASM desteği

NDK, x86 ve x86-64'te çalışacak YASM inceleyebilirsiniz. YASM, x86 ve x86-64 için açık kaynak bir derleyicidir temel aldığı birkaç teknolojiden bahsettik.

CMake ile derleme kodu derlemek için projenizin içinde aşağıdaki değişiklikleri yapın: CMakeLists.txt:

  1. Değeri ASM_NASM olarak ayarlanmış enable_language öğesini çağırın.
  2. Paylaşılan bir kitaplık mı yoksa yürütülebilir bir kitaplık mı derlediğinize bağlı olarak ikili sayı, add_library veya add_executable yöntemini çağırın. İçinde bağımsız değişkenlerin yerine, .asm dosyalarından oluşan bir kaynak dosyaları listesi iletin. için YASM'deki montaj programı ve ilişkili C'nin .c dosyaları veya işlevler kullanabilirsiniz.

Aşağıdaki snippet'te, CMakeLists.txt öğenizi Google Etiket Yöneticisi ile paylaşılan kitaplık olarak bir YASM programı oluşturma.

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 bir YASM programı oluşturma örneği için yasm test edin.

Sorun bildirme

NDK veya CMake araç zinciri dosyasıyla ilgili herhangi bir sorunla karşılaşırsanız bunları bildirin başlıklı makaleyi inceleyebilirsiniz. Gradle veya Android Gradle Eklentisi sorunları. Bunun yerine Studio hatasını bildirin.