实用后端砖头Android

Android Studio 导入第三方 C/C++库

2022-07-15  本文已影响0人  安然罓安好

前提说明:

本文以导入 腾讯 IM SDK C++ 为例

库地址:

IM SDK C++下载链接:https://github.com/TencentCloud/TIMSDK/tree/master/Android/IMSDK

image.png

一:C/C++库导入

二:CMakeLists.txt 文件配置

1. 设置目标库

# 添加项目
project("imdemo")

# 添加目标库
add_library(
        imdemo #设置库名称

        SHARED #设置库为共享库

        native-lib.cpp # 添加.cpp源文件
)

注:imdemo 要与 System.loadLibrary("imdemo"); 名称一致

2. 添加库头文件

# 添加依赖头文件路径:直接填 文件夹名称就行
include_directories( include )

3. 添加第三方库

#导入第三方动态库
add_library(imsdk SHARED IMPORTED)

4. 设置第三方库所在位置

#设置第三方库所在位置
set_target_properties(
        imsdk
        PROPERTIES IMPORTED_LOCATION
        # {CMAKE_SOURCE_DIR} 这个地址对应的是 CMakeList.txt 地址,也就是:.../工程名/app/src/main/cpp/,我们需要定位到include文件夹下,所以得改成:${CMAKE_SOURCE_DIR}/../jniLibs
        #/${ANDROID_ABI}表示处理器架构 第三方库必须存放在这类路径下
        # 路径一定要设置正确,不然会报依赖错误(注:一定要仔细、一定要仔细、一定要仔细)
        ${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libImSDK.so
)

5. 将第三方库与目标库进行关联

target_link_libraries( # Specifies the target library.
        imdemo

        ${log-lib}

        # 将第三方库与目标库进行关联
        imsdk
)

二:bulid.gradle 配置

android->defaultConfig下 指定 ndk 架构,防止不兼容

defaultConfig {
        ...
        // 指定要ndk需要兼容的架构(这样其他依赖包里mips,x86,"armeabi-v7a",arm-v8之类的so会被过滤掉
        ndk {
            abiFilters  "armeabi-v7a", "arm64-v8a"  )
        }

    }

运行时,如果有遇到库冲突问题,需要在 android->defaultConfig添加如下配置

    defaultConfig {
       ...

        // 指定要ndk需要兼容的架构(这样其他依赖包里mips,x86,"armeabi-v7a",arm-v8之类的so会被过滤掉
        ndk {
            abiFilters  "armeabi-v7a", "arm64-v8a"  )
        }
        //不加这个会导致多个so冲突:https://developer.android.com/r/tools/jniLibs-vs-imported-targets
        sourceSets {
            main {
                // The libs directory contains prebuilt libraries that are used by the
                // app's library defined in CMakeLists.txt via an IMPORTED target.
                jniLibs.srcDirs = ['libs']
            }
        }
    }

--------至此已完成导入,后面可以不用在意。只是将 CMakeLists.txt 配置改成"通配样式"--------

# 设置 cmake 版本
cmake_minimum_required(VERSION 3.18.1)

# 设置项目名称
project("objName")

# 设置.cpp 原文件统一管理变量 src-files
file(GLOB src-files
        ${CMAKE_SOURCE_DIR}/*.cpp # 原文件通配路径
        ${CMAKE_SOURCE_DIR}/folder/*.cpp # 原文件通配路径
        )

#添加目标库
add_library(objName SHARED
        ${src-files})

# 导入头文件
include_directories(include)

# 默认自带
find_library(log-lib log)

# 添加第三方库(xxxx表示第三方库别名)
add_library(xxxx SHARED IMPORTED )

# 设置 so库路径通用变量 jnilibs
set(jnilibs "${CMAKE_SOURCE_DIR}/../jniLibs")

# 设置第三方库对应的所在位置(xxxx表示第三方库别名)
set_target_properties(xxxx PROPERTIES IMPORTED_LOCATION ${jnilibs}/${ANDROID_ABI}/libImSDK.so)

# 设置第三方库统一管理变量 third-party-libs (xxxx表示第三方库别名)
set(third-party-libs
        xxxx
        )

# 将目标库与第三方库关联
target_link_libraries(
        imndkdemo
        ${log-lib}
        ${third-party-libs}
)
上一篇下一篇

猜你喜欢

热点阅读