Проблема с компиляцией связанных библиотек в Android Studio / Gradle - PullRequest
0 голосов
/ 17 апреля 2019

Я хочу скомпилировать библиотеки, которые включены в мой проект. И я сталкиваюсь с 2 проблемами.

Прежде всего Cmake, похоже, не обнаруживает / не включает этот каталог.

Второй - после обнаружения / включения связанного каталога вместо набора инструментов Android, системный используется для компиляции библиотек.

В качестве обходного пути к первой проблеме я добавил 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

Ответы [ 3 ]

0 голосов
/ 20 апреля 2019

Для создания собственной библиотеки с использованием системы cmake.

  1. определите CMakeLists.txt в вашем модуле (локальный исходный код, который будет использоваться для генерации lib).

    add_library (xyz STATIC имя-папки / xyz.cpp)

    target_include_directories(xyz PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/..)
    
  2. определить файл CMakeLists.txt в папке cpp вашего модуля приложения для Android.

    cmake_minimum_required (ВЕРСИЯ 3.4.1)

    / * используя существующую библиотеку ndk, если хотите, вы можете удалить эту * /

    сборку native_app_glue в качестве статической библиотеки.

    add_library (native_app_glue STATIC $ {ANDROID_NDK} /sources / android / native_app_glue / android_native_app_glue.c)

    Импорт файла CMakeLists.txt для библиотеки glm

    add_subdirectory (glm)

    / * требуется, если вы добавляете расположение файлов заголовков* / target_include_directories (игра ЧАСТНАЯ $ {CMAKE_CURRENT_SOURCE_DIR} $ {CMAKE_CURRENT_SOURCE_DIR} / data $ {ANDROID_NDK} / sources / android / native_app_glue)

    добавление зависимостей libis_jpg)

  3. определить модуль приложения build.gradle

    android {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
        }
    }
    

    }

  4. Также проверьте команды сборки CMake, чтобы проверить, какие все параметры используются во время сборки.Проверьте этот файл app.externalNativeBuild \ cmake \ debug \ x86 \ cmake_build_command.txt

0 голосов
/ 20 апреля 2019

Так вот, как он собирает 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()
0 голосов
/ 19 апреля 2019

Если вы пытаетесь использовать предварительно встроенную библиотеку, отличную от 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

...