Создать собственную библиотеку в студии Android

Я создал проект студии Android с поддержкой C++ и установил собственный комплект разработки и другие необходимые инструменты. Как импортировать другую предварительно созданную собственную библиотеку для включения в код C++. Я хочу сделать что-то подобное Создать собственную библиотеку в студии Android

Я отредактировал cmakelist.txt, как указано ниже, и теперь он показывает общую библиотеку в папке cpp. Создать собственную библиотеку в студии Android

cmake_minimum_required(VERSION 3.4.1)
set(distribution_DIR ${CMAKE_SOURCE_DIR}/../../../../distribution)
add_library(lib_gmath STATIC IMPORTED)
set_target_properties(lib_gmath PROPERTIES IMPORTED_LOCATION
${distribution_DIR}/gmath/lib/${ANDROID_ABI}/libgmath.a)
add_library(lib_gperf SHARED IMPORTED)
set_target_properties(lib_gperf PROPERTIES IMPORTED_LOCATION
${distribution_DIR}/gperf/lib/${ANDROID_ABI}/libgperf.so)
add_library(lib_ocr SHARED IMPORTED)
set_target_properties(lib_ocr PROPERTIES IMPORTED_LOCATION
${distribution_DIR}/ocr/lib/${ANDROID_ABI}/libLPROCR.so)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
add_library(hello-libs SHARED
        hello-libs.cpp)
target_include_directories(hello-libs PRIVATE
                       ${distribution_DIR}/gmath/include
                       ${distribution_DIR}/gperf/include)
target_link_libraries(hello-libs
                  android
                  lib_gmath
                  lib_gperf
                  lib_ocr
                  log)

Но я не могу включать классы из этой предварительно созданной библиотеки в свой код на C++.

Это задокументировано здесь: developer.android.com/ndk/guides/prebuilts

Richard Critten 22.09.2018 08:59

@RichardCritten Я уже читал это несколько раз, но не понимаю. В нем говорится, что дайте модулю имя, а затем отредактируйте модуль android.mk, но я не вижу ничего подобного в структуре проекта.

jatin rana 22.09.2018 09:09

Вы ищете открытый API libLPROCR.so?

Alex Cohn 22.09.2018 11:59

@AlexCohn Да, наверное, исходники.

jatin rana 22.09.2018 12:54

Как вы думаете, чем может быть полезна эта библиотека?

Alex Cohn 22.09.2018 14:37
0
5
1 268
1

Ответы 1

Я должен здесь упомянуть несколько вещей.

  1. Я предлагаю перейти на gradle+clang для сборки вашего кода. Android.mk как-то стареет, и лучше использовать более новые системы сборки, если вы начинаете новый проект.
  2. Убедитесь, что вашу предварительно созданную библиотеку можно использовать в android. Если это не так, вам нужно сначала построить его. Например, я сам собрал openssl, потому что не смог найти подходящую готовую библиотеку.

Если вы используете gradle+cmake, вот простой файл CMakeLists.txt для ваших готовых библиотек:

cmake_minimum_required(VERSION 3.4.1)

add_library( core-api
             SHARED
             src/main/cpp/mysource.c )

# prebuilt libraries

add_library( crypto-lib
             STATIC
             IMPORTED )

set_target_properties( crypto-lib
                       PROPERTIES IMPORTED_LOCATION
                       ${CMAKE_CURRENT_SOURCE_DIR}/../prebuilt/crypto/${ANDROID_ABI}/lib/libcrypto.a )


include_directories( src/main/cpp/
                     ../prebuilt/crypto/common/include/
                     ../prebuilt/crypto/${ANDROID_ABI}/include/ )

# other libraries

find_library( log-lib
              log )

target_link_libraries( core-api
                       crypto-lib
                       ${log-lib} )

И это файл gradle, который использует этот CMakeLists.txt:

apply plugin: 'com.android.library'

android {
    compileSdkVersion rootProject.ext.sdkVersion

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 27

        externalNativeBuild {
            cmake {
                arguments "-DANDROID_TOOLCHAIN=clang", "-DANDROID_STL=c++_static"
                cFlags "-D__STDC_FORMAT_MACROS", "-fno-integrated-as"
            }
        }

        ndk {
            abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
        }
    }

    buildTypes {
        release {
            minifyEnabled true
            shrinkResources false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }

        debug {
            externalNativeBuild {
                cmake {
                    cFlags "-Wall","-DDEBUG"
                }
            }

            debuggable true
        }
    }

    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
}

Я использую gradle + cmake и отредактировал cmakelist.txt, похожий на ваш. Я вижу готовую библиотеку в папке cpp, помеченной как общая библиотека. Готовая библиотека отлично работает в других проектах. Но как использовать этот код библиотеки в моем коде на C++? я не могу включать файлы. У меня нет заголовочного файла, а есть только файл .so.

jatin rana 22.09.2018 10:09

Вам действительно нужно включать заголовки. если вы экспортировали класс C++, вы не сможете найти классы без файлов заголовков. вы можете найти экспорт C, если точно знаете имя, но для C++ вы почти не можете (это будет очень сложно). если ваша предварительно созданная библиотека является общей, вам нужно использовать add_library(crypto-lib SHARED IMPORTED), и другие настройки, я думаю, должны быть аналогичными.

Afshin 22.09.2018 10:37

Хорошо спасибо. У меня нет заголовков include, а есть только файл .so. Я посмотрю в Интернете, если смогу найти исходный код этой предварительно созданной библиотеки.

jatin rana 22.09.2018 10:46

Другие вопросы по теме