首页 > 解决方案 > 在 android studio 中创建原生库

问题描述

我已经创建了具有 c++ 支持的 android studio 项目,并安装了本机开发工具包和其他必需的工具。如何导入另一个预构建的本机库以包含在 c++ 代码中。我想做这样的事情 我想做这样的事情

我已经编辑了 cmakelist.txt,如下所示,现在它在 cpp 文件夹下显示共享库。 在此处输入图像描述

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++ 代码中包含该预建库中的类。

标签: androidc++android-ndkndk-build

解决方案


我应该在这里提到几件事。

  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'])
}

推荐阅读