Я хочу скомпилировать библиотеки, которые входят в мой проект. И я столкнулся с 2 проблемами.
Во-первых, Cmake, похоже, не обнаруживает/не включает этот каталог.
Во-вторых, после обнаружения/включения связанного каталога вместо набора инструментов Android системный используется для компиляции библиотек.
В качестве обходного пути к 1-й проблеме я добавил if (ANDROID), чтобы добавить этот каталог, чтобы его можно было включить.
if (EXISTS "${CMAKE_SOURCE_DIR}/libs/CMakeLists.txt")
message(STATUS "Using bundled libraries located at ${CMAKE_SOURCE_DIR}/libs")
if (ANDROID)
add_subdirectory(libs)
else()
include(libs/CMakeLists.txt)
endif ()
else()
Таким образом, для меня ожидаемый результат должен следовать, например, включать libs/CMakeLists.txt и создавать библиотеки с использованием цепочки инструментов, предоставленной NDK.
Если вы пытаетесь использовать предварительно созданную библиотеку, отличную от ndk, для собственного компонента, добавьте сведения об этой библиотеке в CMake, как указано ниже.
add_library( imported-lib
SHARED
IMPORTED )
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 )
https://developer.android.com/studio/projects/configure-cmake#add-other-library
Для создания собственной библиотеки с использованием системы cmake.
определите CMakeLists.txt в своем модуле (локальный исходный код, который будет использоваться для создания библиотеки).
add_library(xyz СТАТИЧЕСКИЙ имя-папки/xyz.cpp)
target_include_directories(xyz PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/..)
определите CMakeLists.txt в папке cpp вашего модуля приложения Android.
cmake_minimum_required (ВЕРСИЯ 3.4.1)
/* используя существующую ndk lib, если хотите, можете удалить ее */
add_library(native_app_glue СТАТИЧЕСКИЙ ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c)
add_subdirectory(glm)
/* требуется, если вы добавляете местоположение файлов заголовков */ target_include_directories(игра ЧАСТНАЯ ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/данные ${ANDROID_NDK}/sources/android/native_app_glue)
target_link_libraries( native_app_glue xyz )
определить модуль приложения build.gradle
андроид { compileSdkVersion 28
defaultConfig {
applicationId 'com.google.sample.tunnel'
minSdkVersion 14
targetSdkVersion 28
versionCode 1
versionName '1.0'
}
externalNativeBuild {
cmake {
version '3.10.2'
path 'src/main/cpp/CMakeLists.txt' // location of second(app module) CMakeLists.txt
}
}
}
Также проверьте команды сборки CMake, чтобы убедиться, что все параметры используются во время сборки. Проверить этот файл app.externalNativeBuild\cmake\debug\x86\cmake_build_command.txt
Дело в том, что проект при компиляции библиотек использует совершенно другой подход. Вот почему. PS: Я сделаю новый пост, чтобы вы могли видеть, как это выглядит.
Вот как он собирает libcurl, сначала настраивает его, а затем компилирует с использованием неправильной цепочки инструментов. Я нашел кое-что здесь https://developer.android.com/ndk/guides/other_build_systems, но он экспортирует 1 набор инструментов на сборку. Мой использует 2 аби
ndk {
// Specifies the ABI configurations of your native
// libraries Gradle should build and package with your APK.
abiFilters 'armeabi-v7a', 'arm64-v8a'
}
Как видите, вместо этого используется ExternalProject_Add.
#-----------------------------------------------------------------
# Build bundled cURL library
#-----------------------------------------------------------------
if (BUNDLED_CURL AND (BUILD_CLIENT OR BUILD_SERVER))
ExternalProject_Add(
bundled_curl
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/curl
CONFIGURE_COMMAND ./configure --prefix=${CMAKE_CURRENT_BINARY_DIR}/libs/curl
--enable-shared=no --enable-static=yes
--enable-http --enable-ftp --disable-file
--disable-ldap --disable-ldaps --disable-rtsp
--enable-proxy --disable-dict --disable-telnet
--disable-tftp --disable-pop3 --disable-imap
--disable-smb --disable-smtp --disable-gopher
--without-ssl --without-libssh2 --without-nghttp2
--without-gssapi --with-zlib
--disable-ares --enable-threaded-resolver
--enable-ipv6 --enable-unix-sockets
--without-libidn2 --disable-manual
--disable-sspi --enable-libgcc
--without-libmetalink --without-libpsl
--without-librtmp ${CROSS_COMPILE32_FLAGS}
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/libs/curl
BUILD_COMMAND make
INSTALL_COMMAND make install
BUILD_IN_SOURCE 1
)
set(CURL_BUNDLED_LIBRARY "${CMAKE_CURRENT_BINARY_DIR}/libs/curl/lib/libcurl.a")
set(CURL_BUNDLED_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/libs/curl/include")
endif ()
Но что тогда, если этой предварительно собранной библиотеки, отличной от ndk, еще не существует? Мне нужно как-то его скомпилировать? Вот снимок, когда я включаю BUNDLED_LIBS=ON в build.gradle. pastebin.com/WxrXKCvt Это должно использовать цепочку инструментов NDK вместо системной.