Создать нативную библиотеку в андроид студии - PullRequest
0 голосов
/ 22 сентября 2018

Я создал проект студии android с поддержкой c ++ и установил собственный комплект разработки и другие необходимые инструменты.Как импортировать другую готовую нативную библиотеку для включения в код на С ++.Я хочу сделать что-то вроде этого I want to do something like this

Я отредактировал cmakelist.txt, как указано ниже, и теперь он показывает общую библиотеку в папке cpp.enter image description here

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 ++.

1 Ответ

0 голосов
/ 22 сентября 2018

Есть несколько вещей, которые я должен упомянуть здесь.

  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'])
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...