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:
- Üçüncü taraf kaynağı deponuza sunar (ör. kopyalayarak) ve add_subdirectory ile kullanılabilir. Bu yalnızca diğer kitaplık da CMake ile geliştirilmiştir.
- Bir ExternalProject tanımlayın.
- Kitaplığı projenizden ayrı olarak oluşturun ve Önceden oluşturulmuş kitaplıkları içe aktarmak için önceden oluşturulmuş kitaplıkları kullanın.
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
:
- Değeri
ASM_NASM
olarak ayarlanmışenable_language
öğesini çağırın. - Paylaşılan bir kitaplık mı yoksa yürütülebilir bir kitaplık mı derlediğinize bağlı olarak
ikili sayı,
add_library
veyaadd_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.