Связывание библиотек stati c ".a" с проектом Android Studio с использованием Gradle и CMake - PullRequest
1 голос
/ 17 февраля 2020

Мне нужно связать предварительно собранную библиотеку ".a" stati c с проектом Android Studio, используя CMakeLists.txt.

Библиотека .a была правильно построена для armeabi, armeabiv- 7a, mips и x86 (его можно даже «objdumped» для «проверки содержимого») и файлы «.h» также подходят.

Цель не состоит в том, чтобы перекомпилировать исходники библиотеки вместе с Мои Android Собственные исходники проекта Studio.

Также, пожалуйста, не обращайтесь к решениям, использующим NDK + Andoid.mk (только CMakeLists.txt).

Поскольку на этом примере нет работающего примера в Интернете (включая документацию по Google NDK и SO), пожалуйста, предоставьте все необходимые изменения для файлов проекта и / или структуры проекта.

Я держу файл ".a" и его каталог "include" в локальная папка, поэтому в качестве мета-ссылки на это местоположение, пожалуйста, рассмотрите /lib.a и /include.

Спасибо.

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

Создайте подмодуль для вашего проекта.

поместите ваши * .a файлы в соответствующие библиотеки libs / armApptiful / nameOfLib.a

в вашем cmakelists.txt и добавьте следующие строки

set(import-lib-location ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs)

убедитесь, что это соответствует местоположению вашей папки libs, не используйте абсолютный путь

поместите ваши .h файлы в каталог include подмодуля main.cpp.include

add следующее в ваш файл CmakeLists.txt

include_directories(include/) 
add_library(nameOfLib STATIC IMPORTED )
set_target_properties(crypto
        PROPERTIES IMPORTED_LOCATION ${import-lib-location}/${ANDROID_ABI}/nameOfLib.a)


target_link_libraries( # Specifies the target library.
        your_main_cpp_file

        nameOfLib
        )

Ваша stati c lib будет доступна через api, записанный в вашем основном файле cpp, и код java / kotlin, написанный в этом модуле

В вашем build.gradle вашего основного модуля напишите

api project(path: ':project_that_contains_a_libs')
0 голосов
/ 19 февраля 2020

После долгих исследований по этому вопросу, это рабочее решение с несколькими незначительными проблемами.

Проблема № 1:

Это должно сработать размещение файла libxyz.a lib и его каталога include в {папка AndroidStudioProjects} / {имя проекта} / app / libs , но для некоторых (пока неизвестно ) причина, в моей системе это никогда не работало так.

Мне удалось заставить его работать, поместив оба (файл lib и include dir) в: {папка AndroidStudioProjects} / {Имя проекта} / app / src / main / cpp / libs (который должен был быть создан).

Проблема № 2:

Я столкнулся с некоторыми 32-битными х 64-битными ссылками проблемы, так что в этот момент я отказался от "толстых APK" и оставил его только 32-битным.

Что я делал

On CMakeLists. txt add:

add_library(xyz STATIC IMPORTED)
set_target_properties(xyz PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/libxyz.a)

И на target_link_libraries (в вашу общую нативную библиотеку) вы должны добавить ссылку "xyz":

target_link_libraries(
    #the target shared lib:
    native-lib
    #other libs to link go here
    xyz)

Extra:

Если вы хотите иметь возможность включать заголовки в libxyz.a в свой код C ++, используя по умолчанию include dir, например:

#inlcude <xyz.h>

You необходимо добавить его в CMakeLists.txt :

include_directories( ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/include )

Сделать вывод только 32-битным

On build.gradle (Модуль: app) go в блок "android defaultConfig", прямо перед "externalNativeBuild" и добавьте ndk abiFilters:

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.your.project"
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        ndk {
            abiFilters 'armeabi-v7a', 'x86'
        }
        externalNativeBuild {
            cmake {
                cppFlags ""
            }
        }
    }

Пожалуйста, не стесняйтесь улучшать это.

...