Uno script di build CMake è un file di testo normale a cui devi assegnare un nome
CMakeLists.txt
e include i comandi utilizzati da CMake per creare
librerie C/C++. Se le origini native non dispongono già di una build CMake
devi crearne uno personalmente e includere lo script CMake appropriato
tramite comandi SQL. Per scoprire come installare CMake, consulta Installare e configurare NDK
e CMake.
Questa sezione illustra alcuni comandi di base da includere nella build script per indicare a CMake quali origini utilizzare per creare libreria. Per saperne di più, leggi la documentazione ufficiale sui comandi CMake.
Dopo aver configurato un nuovo script di build CMake, devi configurare Gradle per includere il progetto CMake come dipendenza nella build, in modo che Gradle crei pacchettizza la tua libreria nativa con l'APK dell'app.
Nota: se il progetto utilizza ndk-build, non è necessario
per creare uno script di build CMake. Puoi semplicemente
configura Gradle
per includere il progetto esistente della libreria nativa fornendo un percorso
Android.mk
.
Creare uno script di build CMake
Per creare un file di testo normale da utilizzare come script di build CMake, procedi nel seguente modo:
- Apri il riquadro Progetto dal lato sinistro dell'IDE e seleziona la Vista Progetto dal menu a discesa.
- Fai clic con il tasto destro del mouse sulla directory principale di your-module e
seleziona Nuovo > File.
Nota:puoi creare lo script di compilazione in qualsiasi posizione. Tuttavia, quando configuri lo script di build, i percorsi dell'origine nativa i file e le librerie sono relativi alla posizione dello script di build.
- Inserisci "CMakeLists.txt" come nome file e fai clic su OK.
Ora puoi configurare lo script di build aggiungendo i comandi CMake. Per indicare
CMake per creare una libreria nativa da codice sorgente nativo, aggiungi i comandi cmake_minimum_required()
e add_library()
al tuo script di 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 )
Suggerimento:in modo simile a come puoi chiedere a CMake di creare una libreria nativa
di origine, puoi utilizzare
.
add_executable()
per indicare a CMake di creare invece
eseguibile dai file di origine. Tuttavia, la creazione di eseguibili
le origini native sono facoltative e la creazione di librerie native da pacchettizzare
L'APK soddisfa la maggior parte dei requisiti di progetto.
Quando aggiungi un file sorgente o una libreria allo script di build CMake utilizzando
add_library()
, Android Studio mostra anche i file di intestazione associati
nella vista Progetto dopo aver sincronizzato il progetto. Tuttavia,
per consentire a CMake di individuare i file di intestazione durante la compilazione,
aggiungi il comando include_directories()
a CMake
script di compilazione e specifica il percorso delle tue intestazioni:
add_library(...) # Specifies a path to native header files. include_directories(src/main/cpp/include/)
La convenzione utilizzata da CMake per assegnare un nome al file della tua raccolta è la seguente:
liblibrary-name.so
Ad esempio, se specifichi "native-lib" come nome della tua libreria condivisa
nello script di build, CMake crea un file denominato
libnative-lib.so
. Tuttavia, quando carichi questa libreria nel tuo
Nel codice Java o Kotlin, utilizza il nome specificato nello script di build CMake:
Kotlin
companion object { init { System.loadLibrary("native-lib"); } }
Java
static { System.loadLibrary("native-lib"); }
Nota: se rinomini o rimuovi una libreria nella build CMake devi pulire il progetto prima che Gradle applichi le modifiche rimuove la versione precedente della libreria dall'APK. Per pulire progetto, seleziona Crea > Cancella progetto dalla barra dei menu.
Android Studio aggiunge automaticamente i file di origine e le intestazioni
gruppo cpp nel riquadro Progetto. Utilizzando
più comandi add_library()
, puoi definire altre impostazioni
per creare le librerie di CMake da altri file di origine.
Aggiungi API NDK
Android NDK fornisce un insieme di API e librerie native che potresti trovare
utile. Puoi utilizzare una qualsiasi di queste API includendo le librerie NDK nella libreria
CMakeLists.txt
.
Le librerie NDK predefinite esistono già sulla piattaforma Android, quindi devi crearle o pacchettizzarle nell'APK. Poiché le librerie NDK fanno già parte del percorso di ricerca di CMake, non occorre neppure specificare della libreria nell'installazione NDK locale, devi solo fornire a CMake il nome della libreria che vuoi utilizzare e collegarla rispetto alla tua libreria nativa.
Aggiungi il comando find_library()
alla tua build CMake
per individuare una libreria NDK e memorizzare il relativo percorso come variabile. Utilizzi
questa variabile per fare riferimento alla libreria NDK in altre parti dello script di build.
L'esempio seguente individua la libreria di supporto dei log specifica per Android
e archivia il proprio percorso in 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 )
Affinché la tua libreria nativa possa chiamare le funzioni in log
di archiviazione, devi collegare le librerie utilizzando il comando target_link_libraries()
in
il tuo script di 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 include anche alcune librerie come codice sorgente che devi creare
e collegalo alla tua libreria nativa. Puoi compilare il codice sorgente in un
libreria nativa utilizzando il comando add_library()
in CMake
di compilazione. Per fornire un percorso alla libreria NDK locale, puoi utilizzare il metodo
Variabile di percorso ANDROID_NDK
, utilizzata automaticamente da Android Studio
che definisce automaticamente.
Il seguente comando indica a CMake di creare
android_native_app_glue.c
, che gestisce NativeActivity
degli eventi del ciclo di vita e input tocco, in una libreria statica e
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} )
Aggiungi altre librerie predefinite
Aggiungere una libreria predefinita è simile a specificare un'altra libreria nativa per
CMake per creare. Tuttavia, poiché la libreria è già stata creata, dovrai
utilizzare il flag IMPORTED
per indicare a CMake che
Vuoi importare la libreria nel tuo progetto:
add_library( imported-lib SHARED IMPORTED )
Devi quindi specificare il percorso della libreria utilizzando il metodo
Comando set_target_properties()
come
come mostrato di seguito.
Alcune librerie forniscono pacchetti separati per architetture CPU specifiche oppure
Application Binary Interfaces (ABI) e
e organizzarli in directory separate. Questo approccio aiuta le librerie
di alcune architetture della CPU, consentendo allo stesso tempo di usare
o versioni successive della libreria. Aggiunta di più versioni ABI di una libreria
allo script di build CMake, senza dover scrivere più comandi
ogni versione della libreria, puoi usare il percorso ANDROID_ABI
. Questa variabile utilizza un elenco di ABI predefinite supportate dall'NDK o un elenco filtrato
di ABI che
.
configurare manualmente Gradle da utilizzare. Ad esempio:
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 )
Affinché CMake possa individuare i file di intestazione durante la compilazione, è necessario utilizzare
il comando include_directories()
e includi il percorso
file di intestazione:
include_directories( imported-lib/include/ )
Nota:se vuoi creare un pacchetto per una libreria predefinita che non sia
una dipendenza in tempo di build, ad esempio, quando aggiungi una libreria predefinita che
della dipendenza di imported-lib
, non devi eseguire
seguendo le istruzioni per collegare la libreria.
Per collegare la libreria predefinita alla tua libreria nativa, aggiungila alla
Comando target_link_libraries()
nello script di build CMake:
target_link_libraries( native-lib imported-lib app-glue ${log-lib} )
Per pacchettizzare la libreria predefinita nell'APK, devi:
configurare manualmente Gradle con il blocco sourceSets
per
includi il percorso del file .so
. Dopo aver creato l'APK,
puoi verificare quali librerie dei pacchetti Gradle nel tuo APK utilizzando
Strumento di analisi APK.
Includi altri progetti CMake
Se vuoi creare più progetti CMake e includerne gli output nel tuo
progetto Android, puoi utilizzare un file CMakeLists.txt
come
script di build CMake di primo livello (che è quello che
link
a Gradle) e aggiungi altri progetti CMake come dipendenze di quella build
lo script. Il seguente script di build CMake di primo livello utilizza
Comando add_subdirectory()
per specificare
un altro file CMakeLists.txt
come dipendenza della build, quindi si collega
rispetto al suo output, proprio come farebbe con qualsiasi altra libreria predefinita.
# 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 )
Chiama CMake dalla riga di comando
Utilizza il comando seguente per chiamare CMake e generare un progetto Ninja all'esterno di 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
Questo comando genererà il progetto Ninja che può essere eseguito per creare
Librerie eseguibili di Android (.so
file). Il valore CMAKE_TOOLCHAIN_FILE
è
necessaria per utilizzare l'assistenza CMake di NDK. Per CMake 3.21 o versioni successive, il software
In alternativa, è possibile utilizzare il supporto NDK, ma è necessario utilizzare un gruppo diverso di variabili
come descritto nella documentazione Cross Compiling for Android di CMake.