Skrypt kompilacji CMake to zwykły plik tekstowy, który należy nazwać
CMakeLists.txt
i zawiera polecenia używane przez CMake do tworzenia
Biblioteki C/C++. Jeśli źródła natywne nie mają jeszcze kompilacji CMake
musisz utworzyć własny skrypt i dodać do niego odpowiednią
poleceń. Aby dowiedzieć się, jak zainstalować CMake, zobacz Instalowanie i konfigurowanie pakietu NDK
i CMake.
W tej sekcji opisano kilka podstawowych poleceń, które należy uwzględnić w kompilacji skrypt, aby wskazać CMake, których źródeł użyć przy tworzeniu bibliotece. Więcej informacji znajdziesz w oficjalnej dokumentacji polecenia CMake.
Po skonfigurowaniu nowego skryptu kompilacji CMake musisz wykonać konfigurowanie Gradle uwzględnić projekt CMake jako zależność kompilacji, dzięki czemu Gradle kompiluje umieszcza w pakiecie Twoją bibliotekę natywną w pakiecie APK aplikacji.
Uwaga: jeśli Twój projekt używa polecenia ndk-build, nie musisz
i utworzyć skrypt kompilacji w CMake. Wystarczy
skonfiguruj Gradle
, aby uwzględnić istniejący projekt biblioteki natywnej, podając ścieżkę do pliku
Android.mk
.
Tworzenie skryptu kompilacji CMake
Aby utworzyć zwykły plik tekstowy, którego można użyć jako skryptu kompilacji CMake, wykonaj następujące czynności:
- Otwórz panel Projekt po lewej stronie IDE i wybierz Widok Projekt.
- Kliknij prawym przyciskiem myszy katalog główny your-module, a następnie
wybierz Nowy > Plik.
Uwaga: skrypt kompilacji możesz utworzyć w dowolnej lokalizacji. Jednak podczas konfigurowania skryptu kompilacji ścieżki do źródła natywnego zależą od lokalizacji skryptu kompilacji.
- Wpisz „CMakeLists.txt” i kliknij OK.
Teraz możesz skonfigurować skrypt kompilacji, dodając polecenia CMake. Aby przekazać instrukcje
Aby utworzyć bibliotekę natywną na podstawie natywnego kodu źródłowego, dodaj polecenia cmake_minimum_required()
i add_library()
do skryptu kompilacji:
# 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 )
Wskazówka: podobnie jak w przypadku polecenia CMake, aby utworzyć bibliotekę natywną
plików źródłowych, możesz użyć parametru
add_executable()
, aby nakazać CMake zamiast tego utworzenie
z tych plików źródłowych. Jednak tworzenie plików wykonywalnych z
źródła natywne są opcjonalne, a tworzenie bibliotek natywnych do spakowania w pakiet
Plik APK spełnia większość wymagań dotyczących projektu.
Gdy dodasz plik źródłowy lub bibliotekę do skryptu kompilacji CMake za pomocą
add_library()
, Android Studio pokazuje też powiązane pliki nagłówka
w widoku Projekt po zsynchronizowaniu projektu. Jednak w przypadku
tak aby CMake zlokalizowała pliki nagłówkowe w czasie kompilacji, musisz
dodanie polecenia include_directories()
do obiektu CMake,
skrypt kompilacji i podaj ścieżkę do nagłówków:
add_library(...) # Specifies a path to native header files. include_directories(src/main/cpp/include/)
Zgodnie z konwencją, według której CMake używa nazwy pliku biblioteki, jest taka:
liblibrary-name.so
Jeśli na przykład wpiszesz „native-lib”, jako nazwę biblioteki udostępnionej.
w skrypcie kompilacji CMake tworzy plik o nazwie
libnative-lib.so
Jednak podczas wczytywania tej biblioteki w
W kodzie Java lub Kotlin użyj nazwy podanej w skrypcie kompilacji CMake:
Kotlin
companion object { init { System.loadLibrary("native-lib"); } }
Java
static { System.loadLibrary("native-lib"); }
Uwaga: jeśli zmienisz nazwę biblioteki lub usuniesz ją w kompilacji CMake skryptu, musisz wyczyścić projekt, zanim Gradle wprowadzi zmiany lub powoduje usunięcie starszej wersji biblioteki z pakietu APK. Aby wyczyścić projektu, wybierz Kompilacja > Wyczyść projekt na pasku menu.
Android Studio automatycznie dodaje pliki źródłowe i nagłówki do
grupę cpp w panelu Projekt. Za pomocą
wielu poleceń add_library()
, możesz zdefiniować dodatkowe
do tworzenia bibliotek
na podstawie innych plików źródłowych.
Dodaj interfejsy API NDK
Android NDK zawiera zestaw natywnych interfejsów API i bibliotek, które możesz znaleźć
przydatne. Możesz użyć dowolnego z tych interfejsów API, dodając biblioteki NDK w pliku manifestu projektu
CMakeLists.txt
.
Gotowe biblioteki NDK już istnieją na platformie Androida, więc musisz je kompilować lub spakować do pliku APK. Ponieważ biblioteki NDK są już uwzględnione w ścieżce wyszukiwania CMake, nie musisz nawet określać w lokalizacji biblioteki w lokalnej instalacji NDK – wystarczy wpisz w CMake nazwę biblioteki, której chcesz używać, i połącz ją w porównaniu z własną biblioteką natywną.
Dodaj polecenie find_library()
do kompilacji CMake
skrypt do zlokalizowania biblioteki NDK i zapisania jej ścieżki jako zmiennej. Używasz
tę zmienną, aby odwoływać się do biblioteki NDK w innych częściach skryptu kompilacji.
Ten przykład zawiera bibliotekę obsługi dzienników dotyczących Androida
i zapisuje swoją ścieżkę w 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 )
Aby biblioteka natywna mogła wywoływać funkcje w interfejsie log
biblioteki, musisz połączyć biblioteki za pomocą polecenia target_link_libraries()
skrypt kompilacji 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 zawiera też pewne biblioteki jako kod źródłowy, który jest wymagany
i podaj link do biblioteki natywnej. Kod źródłowy możesz skompilować do postaci
biblioteka natywna za pomocą polecenia add_library()
w CMake
skrypt kompilacji. Aby podać ścieżkę do lokalnej biblioteki NDK, możesz użyć
zmiennej ścieżki ANDROID_NDK
, która jest automatycznie konfigurowana w Android Studio.
za Ciebie.
Poniższe polecenie informuje narzędzie CMake o konieczności skompilowania
android_native_app_glue.c
zarządza firmą NativeActivity
oraz zdarzenia cyklu życia
i dotykowe wprowadzanie danych do biblioteki statycznej.
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} )
Dodaj inne gotowe biblioteki
Dodawanie gotowej biblioteki przypomina określanie innej biblioteki natywnej
Dbaj o siebie. Ponieważ biblioteka jest już utworzona, musisz
użyj flagi IMPORTED
, aby poinformować CMake, że
chcą zaimportować bibliotekę do swojego projektu:
add_library( imported-lib SHARED IMPORTED )
Następnie podaj ścieżkę do biblioteki za pomocą
set_target_properties()
jako
poniżej.
Niektóre biblioteki udostępniają osobne pakiety dla konkretnych architektur procesora lub
interfejsy binarne aplikacji (ABI),
i umieścić je w oddzielnych katalogach. Dzięki temu biblioteki
niektórych architektur procesora, co pozwala na korzystanie
z jej wersji. Dodawanie wielu wersji ABI biblioteki
do skryptu kompilacji CMake, bez konieczności pisania wielu poleceń
każdej wersji biblioteki, możesz użyć ścieżki ANDROID_ABI
. Ta zmienna korzysta z listy domyślnych elementów AIs obsługiwanych przez NDK lub listy filtrowanej
i interfejsów ABI
ręcznie skonfigurować Gradle do użycia. Na przykład:
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 )
Aby narzędzie CMake mogło zlokalizować pliki nagłówkowe podczas kompilowania, musisz użyć
polecenia include_directories()
i uwzględnij ścieżkę do pliku
pliki nagłówka:
include_directories( imported-lib/include/ )
Uwaga: jeśli chcesz spakować gotową bibliotekę, która nie jest
zależność czasu kompilacji, np. podczas dodawania gotowej biblioteki,
zależność imported-lib
, nie musisz wykonywać
wykonaj te instrukcje, aby połączyć z biblioteką.
Aby połączyć gotową bibliotekę z własną biblioteką natywną, dodaj ją do
Polecenie target_link_libraries()
w skrypcie kompilacji CMake:
target_link_libraries( native-lib imported-lib app-glue ${log-lib} )
Aby spakować gotową bibliotekę do pliku APK, musisz:
ręcznie skonfigurować Gradle za pomocą bloku sourceSets
, aby
podaj ścieżkę do pliku .so
. Po utworzeniu pliku APK
może sprawdzić, które biblioteki Gradle znajdują się w Twoim pliku APK, za pomocą polecenia
Analizator plików APK.
Uwzględnij inne projekty CMake
Jeśli chcesz utworzyć wiele projektów CMake i uwzględnić ich dane wyjściowe w
Projektu na Androida, możesz użyć jednego pliku CMakeLists.txt
jako
skrypt kompilacji CMake (który jest
link
do Gradle) i dodać kolejne projekty CMake jako zależności tej kompilacji
skrypt. Następujący skrypt kompilacji CMake najwyższego poziomu wykorzystuje
add_subdirectory()
do określenia
kolejny plik CMakeLists.txt
jako zależność kompilacji, a następnie linki
w porównaniu z danymi wyjściowymi, tak jak w przypadku każdej innej gotowej biblioteki.
# 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 )
Wywołaj CMake z wiersza poleceń
Użyj tego polecenia, aby wywołać CMake i wygenerować projekt Ninja na zewnątrz w 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
To polecenie wygeneruje projekt Ninja, który można wykonać, aby utworzyć
Biblioteki wykonywalne na Androida (pliki .so
). CMAKE_TOOLCHAIN_FILE
to
wymagane do korzystania z obsługi CMake w NDK. W przypadku CMake 3.21 lub nowszego wbudowane jest narzędzie CMake
Zamiast tego można użyć obsługi NDK, ale należy użyć innej grupy zmiennych
jak opisano w dokumentacji CMake na temat kompilacji krzyżowej na Androida.