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 |
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ı için 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.