CMake komut dosyası, isim vermeniz gereken bir düz metin dosyasıdır
CMakeLists.txt
ve CMake'in
C/C++ kitaplıklarında geçerlidir. Yerel kaynaklarınızın halihazırda bir CMake derlemesi yoksa
komut dosyasını kullanmak için, kendiniz bir tane oluşturmanız ve uygun CMake
komutlarının ikisine katlanır. CMake'i nasıl yükleyeceğinizi öğrenmek için NDK'yı yükleme ve yapılandırma
ve CMake olarak değiştirin.
Bu bölümde, derlemenize eklemeniz gereken bazı temel komutlar anlatılmaktadır. komut dosyasını kullanarak yerel reklam öğenizi oluştururken hangi kaynakların kullanılacağını CMake'e bildirir. kitaplığını açar. Daha fazla bilgi edinmek için CMake komutları ile ilgili resmi dokümanları okuyun.
Yeni bir CMake derleme komut dosyası yapılandırdıktan sonra, Gradle'ı yapılandırma CMake projenizi bir derleme bağımlılığı olarak dahil etmeniz gerekir. Böylece Gradle, yerel kitaplığınızı uygulamanızın APK'sı ile paketler.
Not: Projenizde ndk-build kullanılıyorsa
CMake derleme komut dosyası oluşturma. Kolayca
Gradle'ı yapılandırma
web sitenize bir yol sağlayarak mevcut yerel kitaplık projenizi
Android.mk
dosyası olarak kaydedin.
CMake derleme komut dosyası oluşturma
CMake derleme komut dosyanız olarak kullanabileceğiniz bir düz metin dosyası oluşturmak için şu şekilde devam edin:
- IDE'nin sol tarafından Proje bölmesini açın ve Proje görünümünü seçin.
- your-module kök dizinini sağ tıklayın ve
Yeni > Dosya.
Not: Derleme komut dosyasını istediğiniz herhangi bir konumda oluşturabilirsiniz. Ancak derleme komut dosyasını yapılandırırken yerel kaynağınızın yolları dosyaları ve kitaplıklar, derleme komut dosyasının konumuna bağlıdır.
- "CMakeLists.txt" yazın seçeneğini belirleyin ve Tamam'ı tıklayın.
Artık CMake komutları ekleyerek derleme komut dosyanızı yapılandırabilirsiniz. Talimat vermek için
Yerel kaynak kodundan yerel kitaplık oluşturmak için derleme komut dosyanıza cmake_minimum_required()
ve add_library()
komutlarını ekleyin:
# Sets the minimum version of CMake required to build your native library. # This ensures that a certain set of CMake features is available to # your build. cmake_minimum_required(VERSION 3.4.1) # Specifies a library name, specifies whether the library is STATIC or # SHARED, and provides relative paths to the source code. You can # define multiple libraries by adding multiple add_library() commands, # and CMake builds them for you. When you build your app, Gradle # automatically packages shared libraries with your APK. add_library( # Specifies the name of the library. native-lib # Sets the library as a shared library. SHARED # Provides a relative path to your source file(s). src/main/cpp/native-lib.cpp )
İpucu: CMake'in şuradan yerel bir kitaplık oluşturmasını sağladığınıza benzer:
kaynak dosyalar için
add_executable()
komutunu kullanarak CMake'i bunun yerine bir
yürütülebilir dosyalar. Ancak,
yerel kaynaklar isteğe bağlıdır ve kendi
APK, proje gereksinimlerinin çoğunu karşılar.
CMake derleme komut dosyanıza şunu kullanarak bir kaynak dosya veya kitaplık eklediğinizde:
add_library()
, Android Studio ilişkili başlık dosyalarını da gösterir
Proje görünümündeyken Ancak,
CMake'in, derleme süresi sırasında başlık dosyalarınızı bulabilmesi için öncelikle
CMake'inize include_directories()
komutunu ekleyin.
komut dosyasını derleyin ve başlıklarınızın yolunu belirtin:
add_library(...) # Specifies a path to native header files. include_directories(src/main/cpp/include/)
CMake'in, kitaplığınızın dosyasını adlandırmak için kullandığı kural aşağıdaki gibidir:
liblibrary-name.so
Örneğin, "native-lib" değerini belirtirseniz paylaşılan kitaplığınızın adı olarak
CMake, derleme komut dosyasında
libnative-lib.so
Ancak, bu kitaplığı
Java veya Kotlin kodu kullanıyorsanız CMake derleme komut dosyasında belirttiğiniz adı kullanın:
Kotlin
companion object { init { System.loadLibrary("native-lib"); } }
Java
static { System.loadLibrary("native-lib"); }
Not: CMake derlemenizdeki bir kitaplığı yeniden adlandırır veya kaldırırsanız veya Gradle'ın değişiklikleri uygulamadan önce projenizi temizlemeniz kitaplığın eski sürümünü APK'nızdan kaldırır. Cihazınızı temizlemek için altındaki Derle > Projeyi Temizle'yi seçin.
Android Studio, kaynak dosyaları ve üstbilgileri
Proje bölmesindeki cpp grubunu içerir. Şunu kullanarak:
birden fazla add_library()
komutu varsa, bu komutlar için
kitaplıklarını kullanarak CMake'in diğer kaynak dosyalardan derleme yapmasına olanak tanır.
NDK API'leri ekleme
Android NDK, bulabileceğiniz bir dizi yerel API ve kitaplık sağlar.
faydalı olur. NDK kitaplıklarını projenizin hedefine ekleyerek bu API'lerden herhangi birini kullanabilirsiniz.
CMakeLists.txt
komut dosyası.
Önceden oluşturulmuş NDK kitaplıkları Android platformunda zaten mevcuttur. Dolayısıyla bunları derlemeniz veya APK'nızda paketlemeniz gerekir. Çünkü NDK kitaplıkları CMake'in arama yolunun bir parçası olduğu için arama yaparken kullanacağınız kitaplığın yerel NDK kurulumunuzdaki yerini alır; yalnızca şunları yapmanız gerekir: CMake'e, kullanmak istediğiniz kitaplığın adını girin ve buna bağlantı verin kendi yerel kitaplığınızla karşılaştırabilirsiniz.
CMake derlemenize find_library()
komutunu ekleyin
komut dosyasını kullanarak NDK kitaplığını bulur ve yolunu değişken olarak saklar. Kullandığınız
bu değişken, derleme komut dosyasının diğer bölümlerindeki NDK kitaplığına başvurmak için kullanılır.
Aşağıdaki örnek, Android'e özgü günlük destek kitaplığını gösterir
ve yolunu log-lib
içinde saklar:
find_library( # Defines the name of the path variable that stores the # location of the NDK library. log-lib # Specifies the name of the NDK library that # CMake needs to locate. log )
Yerel kitaplığınızın log
içindeki işlevleri çağırması için
kitaplıklarını bağlamak için target_link_libraries()
komutunu kullanarak
CMake derleme komut dosyanız:
find_library(...) # Links your native library against one or more other native libraries. target_link_libraries( # Specifies the target library. native-lib # Links the log library to the target library. ${log-lib} )
NDK, derlemeniz gereken bazı kitaplıkları da kaynak kodu olarak içerir.
ve yerel kitaplığınıza bağlayın. Kaynak kodunu
yerel kitaplık oluşturmak için CMake'inizde add_library()
komutunu kullanın.
derleme komut dosyasıdır. Yerel NDK kitaplığınıza giden yolu sağlamak için
Android Studio'nun otomatik olarak belirlediği ANDROID_NDK
yol değişkeni
bir şablondur.
Aşağıdaki komut, CMake'e
NativeActivity
alanını yöneten android_native_app_glue.c
yaşam döngüsü olaylarını ve dokunmatik girişi statik bir kitaplığa çevirip
native-lib
:
add_library( app-glue STATIC ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c ) # You need to link static libraries against your shared native library. target_link_libraries( native-lib app-glue ${log-lib} )
Önceden oluşturulmuş başka kitaplıklar ekleyin
Önceden oluşturulmuş kitaplık eklemek,
CMake to Build. Ancak, kitaplık zaten oluşturulduğundan
CMake'e şunu bildirmek için IMPORTED
işaretini kullanın:
kitaplığı projenize aktarmak istiyorsanız:
add_library( imported-lib SHARED IMPORTED )
Ardından
set_target_properties()
komutu şu şekildedir:
aşağıda gösterilmiştir.
Bazı kitaplıklar, belirli CPU mimarileri için ayrı paketler sunar veya
Uygulama İkili Arabirimleri (ABI) ve
ve onları ayrı dizinlerde düzenleyebilirsiniz. Bu yaklaşım, kütüphanelerin
belirli CPU mimarilerinden yararlanırken yalnızca
sürümleri de ekleyebilirsiniz. Bir kitaplığın birden fazla ABI sürümünü eklemek için
CMake derleme komut dosyanıza,
kitaplığın her sürümünde ANDROID_ABI
yolunu kullanabilirsiniz
değişkenine eklenmelidir. Bu değişken, NDK'nın desteklediği varsayılan ABI'lerin listesini veya filtrelenmiş bir liste kullanır
ABI'lerin oranı
Gradle'ı manuel olarak yapılandırın. Örnek:
add_library(...) set_target_properties( # Specifies the target library. imported-lib # Specifies the parameter you want to define. PROPERTIES IMPORTED_LOCATION # Provides the path to the library you want to import. imported-lib/src/${ANDROID_ABI}/libimported-lib.so )
CMake'in, derleme süresi sırasında başlık dosyalarınızı bulabilmesi için
include_directories()
komutunu çalıştırın ve
başlık dosyaları:
include_directories( imported-lib/include/ )
Not: Şunu içermeyen önceden oluşturulmuş bir kitaplığı paketlemek istiyorsanız:
Örneğin, herkese açık kullanıcı deneyimine sahip önceden oluşturulmuş
imported-lib
bağımlılığı varsa
adımları uygulayın.
Önceden oluşturulmuş kitaplığı kendi yerel kitaplığınıza bağlamak için şu klasöre ekleyin:
CMake derleme komut dosyanızdaki target_link_libraries()
komutu:
target_link_libraries( native-lib imported-lib app-glue ${log-lib} )
Önceden oluşturulmuş kitaplığı APK'nızda paketlemek için:
Gradle'ı sourceSets
bloğuyla manuel olarak yapılandırarak
.so
dosyanızın yolunu ekleyin. APK'nızı oluşturduktan sonra,
Gradle paketlerini APK'nıza eklemek için
APK Analiz Aracı.
Diğer CMake projelerini dahil et
Birden fazla CMake projesi oluşturmak ve bunların çıktılarını
Android projesi için bir CMakeLists.txt
dosyası kullanabilirsiniz.
üst düzey CMake derleme komut dosyası (bu,
bağlantı
) ve bu derlemenin bağımlıları olarak başka CMake projeleri ekleyin
komut dosyası. Aşağıdaki üst düzey CMake derleme komut dosyası,
Belirtmek için add_subdirectory()
komutu
derleme bağımlılığı olarak başka bir CMakeLists.txt
dosyası oluşturur ve
diğer önceden oluşturulan kitaplıklarda olduğu gibi çıktı.
# Sets lib_src_DIR to the path of the target CMake project. set( lib_src_DIR ../gmath ) # Sets lib_build_DIR to the path of the desired output directory. set( lib_build_DIR ../gmath/outputs ) file(MAKE_DIRECTORY ${lib_build_DIR}) # Adds the CMakeLists.txt file located in the specified directory # as a build dependency. add_subdirectory( # Specifies the directory of the CMakeLists.txt file. ${lib_src_DIR} # Specifies the directory for the build outputs. ${lib_build_DIR} ) # Adds the output of the additional CMake build as a prebuilt static # library and names it lib_gmath. add_library( lib_gmath STATIC IMPORTED ) set_target_properties( lib_gmath PROPERTIES IMPORTED_LOCATION ${lib_build_DIR}/${ANDROID_ABI}/lib_gmath.a ) include_directories( ${lib_src_DIR}/include ) # Links the top-level CMake build output against lib_gmath. target_link_libraries( native-lib ... lib_gmath )
Komut satırından CMake'i çağırma
dışında bir Ninja projesi oluşturmak için CMake'i çağırmak için aşağıdaki komutu kullanın Android Studio:
cmake
-Hpath/to/cmakelists/folder
-Bpath/to/generated/ninja/project/debug/ABI
-DANDROID_ABI=ABI // For example, arm64-v8a
-DANDROID_PLATFORM=platform-version-string // For example, android-16
-DANDROID_NDK=android-sdk/ndk/ndk-version
-DCMAKE_TOOLCHAIN_FILE=android-sdk/ndk/ndk-version/build/cmake/android.toolchain.cmake
-G Ninja
Bu komut, aşağıdaki komut dosyalarını oluşturmak için yürütülebilecek Ninja projesini
Android yürütülebilir kitaplıkları (.so
dosya). CMAKE_TOOLCHAIN_FILE
NDK'nın CMake desteğini kullanmak için gereklidir. CMake 3.21 veya sonraki sürümlerde CMake'in yerleşik
Bunun yerine NDK desteği kullanılabilir ancak farklı bir değişken grubu kullanılmalıdır
açıklandığı gibi CMake'in Android için Çapraz Derleme dokümanlarında açıklandığı şekildedir.