Как создать статическую библиотеку (файл .a) в Android Studio 3.2 с помощью CMake - PullRequest
0 голосов
/ 23 октября 2018

Теперь я создаю новый проект, включающий поддержку c ++ в Android Studio 3.2, он имеет native-lib.cpp, естественно, CMakeLists.txt выглядит так:

add_library( # Sets 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)

Теперь, если я создаю этот проект, я могунайти libnative-lib.so в некоторых «отладочных» директориях, это нормально, но я хочу статическую библиотеку, то есть .a файлов.

Изменить SHARED на STATIC не будусгенерировать эти файлы, что мне еще делать?

В документации CMake не упоминается о другом способе, кроме add_library().

Все документы, которые я искал, говорят только о SHARED/STATIC.

Что я пропустил?

Ответы [ 3 ]

0 голосов
/ 24 октября 2018

Если добавить к комментарию @DanAlbert , вопрос не в том, насколько полезной может быть только статическая библиотека.Проблема в том, что Android Studio через плагин Gradle по умолчанию не будет создавать цель CMake , которая является STATIC библиотекой.

К счастью, вы можете явно указать целей , которые вы хотите создать, например,

android { defaultConfig { externalNativeBuild { cmake {
    targets "native_staticlib"
} } } }

На самом деле, создание статической библиотеки с помощью встроенной externalNativeBuild не так уж и много.Вы можете добиться того же, если вы запустите cmake --build из командной строки.

0 голосов
/ 01 ноября 2018

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

Я записываю этот ответ НЕ , потому что эти ответы неверны, я просто хочучтобы помочь таким новичкам, как я, setp by step, со всеми подробностями, должен знать.

Этот ответ был подтвержден в Android Studio 3.2.1 с CMake 3.4.1 ,я трижды проверил.

Теперь, если вы создаете новый проект с поддержкой C ++ , нажмите «Далее» полностью, вы получите CMakeLists.txt, который должен выглядеть следующим образом:

cmake_minimum_required(VERSION 3.4.1)

add_library( 
        native-lib
        SHARED
        src/main/cpp/native-lib.cpp)

find_library( 
        log-lib
        log)

target_link_libraries( 
        native-lib
        ${log-lib})

Изменить SHARED на STATIC не будет выводить любой файл .a, вы ничего не получите, даже файл .so не будет (конечно, естьв этом файле не будет добавлена ​​библиотека SHARED ).

Это Gradle / Android Studio"ошибка", ответы выше уже упоминали ее, если вы используете CMake один, вы определенно получите файл .a.

ОК, теперь мой TRICK :

У нас уже естьБиблиотека dd SHARED, затем мы добавляем библиотеку STATIC, которая использует тот же исходный файл.Добавьте ниже в CMakeLists.txt:

add_library(
        native-lib-static
        STATIC
        src/main/cpp/native-lib.cpp
)

«native-lib-static» можно заменить любым именем, кроме «native-lib», поскольку оно используется для версии SHARED.

Измените target_link_libraries следующим образом:

target_link_libraries(
        native-lib
        native-lib-static
        ${log-lib})

enter image description here

Gradle-> app-> build-> assemblyDebug / assemblyRelease

Тогда вы получите libnative-lib-static.a, в

app\.externalNativeBuild\cmake\debug(release)\<abi>\libnative-lib-static.a

Этот путь установлен в app\build.gradle:

android{
    defaultConfig{
         externalNativeBuild{
             CMake{

Банкомат. Я не уверен, изменит ли его Google вбудущее, но вы всегда можете найти в папке проекта файлы *.a.

Не думаю, что на этот раз я что-то упустил.

Все заслуги @Michael @Dan Albert @AlexКон @ шижень

0 голосов
/ 24 октября 2018

Изменение SHARED на STATIC не будет генерировать эти файлы, что еще я должен делать?

Вы можете иметь статическую библиотеку, установив для вашей библиотеки значение STATIC и сгенерированный .a находится по адресу <project-dir>/build/intermediates/cmake/debug/obj/<abi>/libnative-lib.a

add_library( native-lib
         STATIC
         src/main/cpp/native-lib.cpp)

Но, как сказал @Dan Albert, сама эта статическая библиотека не очень полезна.Вам все еще нужно связать его с другими частями кода / библиотеки, чтобы получить окончательную общую библиотеку, чтобы ваше приложение Android могло использовать.

Например, ,

add_library(my-shared-native SHARED src/main/cpp/other-source.cpp)
target_link_libraries(my-shared-native -Wl,--whole-archive native-lib -Wl,--no-whole-archive)

Затем на вашей стороне Java вы можете использовать эту общую библиотеку , то есть libmy-shared-native.so.

static {
    System.loadLibrary("my-shared-native");
}
...