前提说明:
本文以导入 腾讯 IM SDK C++ 为例
库地址:
IM SDK C++下载链接:https://github.com/TencentCloud/TIMSDK/tree/master/Android/IMSDK
![](https://img.haomeiwen.com/i6762185/976096eed8ec351a.png)
一:C/C++库导入
![](https://img.haomeiwen.com/i6762185/bad4346b40803af0.png)
![](https://img.haomeiwen.com/i6762185/ea13f90f217ea949.png)
二:CMakeLists.txt 文件配置
1. 设置目标库
# 添加项目
project("imdemo")
# 添加目标库
add_library(
imdemo #设置库名称
SHARED #设置库为共享库
native-lib.cpp # 添加.cpp源文件
)
注:imdemo 要与 System.loadLibrary("imdemo"); 名称一致
![](https://img.haomeiwen.com/i6762185/53b8969cce9e7f98.png)
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添加如下配置
![](https://img.haomeiwen.com/i6762185/db8cd8f82f3c321e.png)
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}
)
网友评论