Собственный код C ++ в Android Studio с библиотекой Stati c - PullRequest
0 голосов
/ 14 февраля 2020

Я пытаюсь создать собственный код C ++ в Android Studio и с CMake. Мой код C ++ использует предварительно скомпилированную библиотеку stati c (.a файл). Я включил его заголовок .h в мой код C ++. Я также связал расположение файлов .h и .a в моем CMakeList.txt, как показано ниже:

include_directories(".h file location")

Затем:

add_library(lib_fastcv STATIC IMPORTED)

set_target_properties(lib_fastcv PROPERTIES IMPORTED_LOCATION
    ".a file location")

И в конце:

target_link_libraries (...lib_fastcv....)

Однако, как только я использую любую функцию из библиотеки .a stati c, он жалуется, что не может распознать функцию, что означает, что библиотека stati c неправильно связана с моим кодом C ++.

Кто-нибудь знает, что еще мне нужно сделать? Должен ли я также отредактировать свой build.gradle для включения информации о файле библиотеки?

1 Ответ

0 голосов
/ 21 февраля 2020

это мое решение: так что, во-первых, CMake может быть странно использовать в самом начале.

1- native-lib1 - продукт вывода CMake. Позже java увидит только .so этого

add_library( # This is out .so product (libnative-lib1.so)
    native-lib1

    # Sets the library as a shared library.
    SHARED

    # These are the input .cpp source files
    native-lib.cpp
    SRC2.cpp
    Any other cpp/c source file you want to compile
    )

2- Любая библиотека, которую вы включили в свой файл souse, с адресом .h необходимо обратиться сюда:

 target_include_directories(# This is out .so product (libnative-lib1.so)
    native-lib1 PRIVATE
    ${CMAKE_SOURCE_DIR}/include)

3- Любая используемая вами реальная библиотека, ее обычные .a или. cpp должна быть адресована CMake следующим образом:

target_link_libraries(
    # This is out .so product (libnative-lib1.so)
    native-lib1

    #These are any extra library files that I need for building my source .cpp files to final .so product
    ${CMAKE_SOURCE_DIR}/lib/libfastcv.a
    # Links the target library to the log library
    # included in the NDK.
    ${log-lib})

Затем build.gradle следует указать, какие форматы abi мы хотим сделать чтобы убедиться, что предварительно созданные файлы .a совместимы.

flavorDimensions "version"
productFlavors {
    create("arm7") {
        ndk.abiFilters("armeabi-v7a")
    }

Наконец, как примечание, приведенная ниже команда не работает для фильтрации работы abis и над командой, даже если они выглядят одинаково в logi c и форма для меня:

        cmake {
            cppFlags "-std=c++11"
            abiFilters 'armeabi-v7a'
        }
    }
    ndk {
        // Specifies the ABI configurations of your native
        // libraries Gradle should build and package with your APK.
        // This is not working to eliminate
        abiFilters 'armeabi-v7a'
    }
}
...