Skrip build CMake adalah file teks biasa yang harus diberi nama
CMakeLists.txt dan berisi perintah yang digunakan CMake untuk mem-build
library C/C++. Jika sumber native belum memiliki skrip build
CMake, Anda harus membuatnya sendiri dan menyertakan perintah CMake
yang sesuai. Untuk mempelajari cara menginstal CMake, lihat Menginstal serta mengonfigurasi NDK
dan CMake.
Bagian ini membahas tentang beberapa perintah dasar yang harus disertakan dalam skrip build agar dapat memberi tahu CMake, sumber yang digunakan saat membuat library native. Untuk mempelajari lebih lanjut, baca dokumentasi resmi tentang perintah CMake.
Setelah mengonfigurasi skrip build CMake baru, Anda harus mengonfigurasi Gradle untuk menyertakan project CMake sebagai dependensi build, agar Gradle dapat mem-build dan memaketkan library native dengan APK aplikasi.
  Catatan: Jika project menggunakan ndk-build, Anda tidak perlu
  membuat skrip build CMake. Cukup
  
    konfigurasikan Gradle
  untuk menyertakan project library native yang ada dengan menyediakan jalur ke file
  Android.mk.
Membuat skrip build CMake
Untuk membuat file teks biasa yang dapat digunakan sebagai skrip build CMake, lakukan langkah-langkah berikut:
- Buka panel Project dari sisi kiri IDE, lalu pilih tampilan Project dari menu drop-down.
- Klik kanan direktori utama your-module, lalu pilih New > File.
    Catatan: Anda dapat membuat skrip build di lokasi mana pun yang diinginkan. Namun, saat mengonfigurasi skrip build, lokasi file dan library sumber native bersifat relatif terhadap lokasi skrip build. 
- Masukkan "CMakeLists.txt" sebagai nama file, lalu klik OK.
  Kini Anda dapat mengonfigurasi skrip build dengan menambahkan perintah CMake. Untuk memerintahkan
  CMake membuat library native dari kode sumber native, tambahkan perintah cmake_minimum_required() dan add_library() ke skrip build:
# 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 )
  Tips: Mirip dengan cara memerintahkan CMake untuk membuat library native dari
  file sumber, Anda dapat menggunakan
  perintah 
  add_executable() untuk memerintahkan CMake membuat
  file yang dapat dieksekusi dari file sumber tersebut. Namun, mem-build file yang dapat dieksekusi dari
  sumber native bersifat opsional, dan mem-build library native untuk dipaketkan dalam
  APK akan memenuhi sebagian besar persyaratan project.
  Bila menambahkan file sumber atau library ke skrip build CMake menggunakan
  add_library(), Android Studio juga akan menampilkan file header terkait
  dalam tampilan Project setelah Anda menyinkronkan project. Namun, agar
  CMake dapat menemukan file header selama waktu kompilasi, Anda harus
  menambahkan perintah include_directories() ke skrip build
  CMake dan menetapkan jalur ke header:
add_library(...) # Specifies a path to native header files. include_directories(src/main/cpp/include/)
Konvensi yang digunakan CMake untuk menamai file library adalah sebagai berikut:
  liblibrary-name.so
  Misalnya, jika Anda menetapkan "native-lib" sebagai nama library bersama
  dalam skrip build, CMake akan membuat file bernama
  libnative-lib.so. Namun, saat memuat library ini dalam
  kode Java atau Kotlin, gunakan nama yang ditetapkan dalam skrip build CMake:
Kotlin
companion object { init { System.loadLibrary("native-lib"); } }
Java
static { System.loadLibrary("native-lib"); }
Catatan: Jika mengganti nama atau menghapus library dalam skrip build CMake, Anda harus membersihkan project sebelum Gradle menerapkan perubahan atau menghapus versi library yang lebih lama dari APK. Untuk membersihkan project, pilih Build > Clean Project dari panel menu.
  Android Studio secara otomatis menambahkan file sumber dan header ke
  grup cpp dalam panel Project. Dengan
  beberapa perintah add_library(), Anda dapat menentukan library
  tambahan agar CMake mem-build dari file sumber lain.
Menambahkan API NDK
  Android NDK menyediakan kumpulan library dan API native yang mungkin 
  berguna. Anda dapat menggunakan salah satu API ini dengan menyertakan library NDK dalam file skrip
  CMakeLists.txt project.
Library NDK bawaan sudah ada di platform Android, sehingga Anda tidak perlu mem-build atau memaketkannya ke dalam APK. Karena library NDK sudah menjadi bagian dari jalur penelusuran CMake, Anda bahkan tidak perlu menetapkan lokasi library dalam penginstalan NDK lokal. Anda hanya perlu memberi CMake nama library yang ingin digunakan dan menautkannya terhadap library native Anda sendiri.
  Tambahkan perintah find_library() ke skrip build
  CMake untuk menemukan library NDK dan menyimpan jalurnya sebagai variabel. Gunakan
  variabel ini untuk merujuk ke library NDK di bagian lain dalam skrip build.
  Contoh berikut menemukan Support Library log khusus Android
  dan menyimpan jalurnya di log-lib:
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 )
  Agar library native dapat memanggil fungsi dalam library
  log, Anda harus menautkan library menggunakan perintah target_link_libraries() dalam
  skrip build CMake:
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 juga mencakup beberapa library sebagai kode sumber yang perlu di-build
  dan ditautkan ke library native. Anda dapat mengompilasi kode sumber menjadi
  library native menggunakan perintah add_library() dalam skrip
  build CMake. Untuk menyediakan jalur ke library NDK lokal, Anda dapat menggunakan
  variabel jalur ANDROID_NDK, yang otomatis ditentukan oleh Android Studio
  untuk Anda.
  Perintah berikut meminta CMake untuk mem-build
  android_native_app_glue.c, yang mengelola input sentuh dan peristiwa siklus proses
  NativeActivity, menjadi library statis dan menautkannya ke
  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} )
Menambahkan library bawaan lainnya
  Cara menambahkan library bawaan mirip dengan cara menetapkan library native lainnya
  yang perlu di-build CMake. Namun, karena library sudah di-build, Anda harus
  menggunakan tanda IMPORTED untuk memberi tahu CMake bahwa
  Anda hanya ingin mengimpor library ke project:
add_library( imported-lib
             SHARED
             IMPORTED )
  Selanjutnya Anda harus menetapkan jalur ke library menggunakan
  perintah set_target_properties() sebagaimana
  ditunjukkan di bawah ini.
  Beberapa library menyediakan paket terpisah untuk arsitektur CPU tertentu, atau
  ABI (Antarmuka Biner Aplikasi), lalu
  mengelolanya menjadi direktori terpisah. Pendekatan ini membantu library memanfaatkan
  arsitektur CPU tertentu sekaligus memungkinkan Anda hanya menggunakan
  versi library yang diinginkan. Guna menambahkan beberapa versi ABI library
  ke skrip build CMake tanpa harus menulis beberapa perintah untuk
  setiap versi library, Anda dapat menggunakan variabel
  jalur ANDROID_ABI. Variabel ini menggunakan daftar ABI default yang didukung NDK, atau daftar
  ABI terfilter yang
  
  dikonfigurasi secara manual untuk digunakan Gradle. Contoh:
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 )
  Agar CMake dapat menemukan file header selama waktu kompilasi, Anda harus menggunakan
  perintah include_directories() dan menyertakan jalur ke
  file header:
include_directories( imported-lib/include/ )
  Catatan: Jika Anda ingin memaketkan library bawaan yang bukan
  dependensi waktu build, misalnya saat menambahkan library bawaan yang merupakan dependensi imported-lib, Anda tidak perlu melakukan
  petunjuk berikut untuk menautkan library.
      Untuk menautkan library bawaan ke library native, tambahkan library tersebut ke
  perintah target_link_libraries() dalam skrip build CMake:
target_link_libraries( native-lib imported-lib app-glue ${log-lib} )
  Guna memaketkan library bawaan ke dalam APK, Anda harus
  mengonfigurasi Gradle secara manual dengan blok sourceSets
  untuk menyertakan jalur ke file .so. Setelah mem-build APK, Anda
  dapat memverifikasi library yang dipaketkan Gradle ke dalam APK menggunakan
  APK Analyzer.
Menyertakan project CMake lainnya
  Jika ingin mem-build beberapa project CMake dan menyertakan output-nya dalam
  project Android, Anda dapat menggunakan satu file CMakeLists.txt sebagai
  skrip build CMake level teratas (yaitu yang
  ditautkan
  ke Gradle) dan menambahkan project CMake tambahan sebagai dependensi skrip build
  tersebut. Skrip build CMake level teratas berikut menggunakan
  perintah add_subdirectory() untuk menetapkan
  file CMakeLists.txt lain sebagai dependensi build, lalu menautkan
  pada output-nya seperti halnya library bawaan lain.
# 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 )
Memanggil CMake dari command line
Gunakan perintah berikut untuk memanggil CMake guna membuat project Ninja di luar 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
Perintah ini akan menghasilkan project Ninja yang dapat dieksekusi untuk membuat
library Android yang dapat dieksekusi (file .so). CMAKE_TOOLCHAIN_FILE
diperlukan untuk menggunakan dukungan CMake NDK. Untuk CMake 3.21 atau yang lebih baru, dukungan NDK
bawaan CMake dapat digunakan, tetapi grup variabel lain harus digunakan
seperti yang dijelaskan dalam dokumentasi Mengompilasi Silang untuk Android dari CMake.
