CMake'i Yapılandırma

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:

  1. IDE'nin sol tarafından Proje bölmesini açın ve Proje görünümünü seçin.
  2. 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.

  3. "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.