前提說明:
本文以導(dǎo)入 騰訊 IM SDK C++ 為例
庫地址:
IM SDK C++下載鏈接:https://github.com/TencentCloud/TIMSDK/tree/master/Android/IMSDK
一:C/C++庫導(dǎo)入
二:CMakeLists.txt 文件配置
1. 設(shè)置目標(biāo)庫
# 添加項目
project("imdemo")
# 添加目標(biāo)庫
add_library(
imdemo #設(shè)置庫名稱
SHARED #設(shè)置庫為共享庫
native-lib.cpp # 添加.cpp源文件
)
注:imdemo 要與 System.loadLibrary("imdemo"); 名稱一致
2. 添加庫頭文件
# 添加依賴頭文件路徑:直接填 文件夾名稱就行
include_directories( include )
3. 添加第三方庫
#導(dǎo)入第三方動態(tài)庫
add_library(imsdk SHARED IMPORTED)
4. 設(shè)置第三方庫所在位置
#設(shè)置第三方庫所在位置
set_target_properties(
imsdk
PROPERTIES IMPORTED_LOCATION
# {CMAKE_SOURCE_DIR} 這個地址對應(yīng)的是 CMakeList.txt 地址,也就是:.../工程名/app/src/main/cpp/捺球,我們需要定位到include文件夾下脚祟,所以得改成:${CMAKE_SOURCE_DIR}/../jniLibs
#/${ANDROID_ABI}表示處理器架構(gòu) 第三方庫必須存放在這類路徑下
# 路徑一定要設(shè)置正確胶背,不然會報依賴錯誤(注:一定要仔細(xì)臭笆、一定要仔細(xì)、一定要仔細(xì))
${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libImSDK.so
)
5. 將第三方庫與目標(biāo)庫進(jìn)行關(guān)聯(lián)
target_link_libraries( # Specifies the target library.
imdemo
${log-lib}
# 將第三方庫與目標(biāo)庫進(jìn)行關(guān)聯(lián)
imsdk
)
三:bulid.gradle 配置
android->defaultConfig下 指定 ndk 架構(gòu)吊骤,防止不兼容
defaultConfig {
...
// 指定要ndk需要兼容的架構(gòu)(這樣其他依賴包里mips,x86,"armeabi-v7a",arm-v8之類的so會被過濾掉)
ndk {
abiFilters "armeabi-v7a", "arm64-v8a"
}
}
運(yùn)行時缆娃,如果有遇到庫沖突問題粪躬,需要在 android->defaultConfig添加如下配置
defaultConfig {
...
// 指定要ndk需要兼容的架構(gòu)(這樣其他依賴包里mips,x86,"armeabi-v7a",arm-v8之類的so會被過濾掉)
ndk {
abiFilters "armeabi-v7a", "arm64-v8a"
}
//不加這個會導(dǎo)致多個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']
}
}
}
--------至此已完成導(dǎo)入,后面可以不用在意殿托。只是將 CMakeLists.txt 配置改成"通配樣式"--------
# 設(shè)置 cmake 版本
cmake_minimum_required(VERSION 3.18.1)
# 設(shè)置項目名稱
project("objName")
# 設(shè)置.cpp 原文件統(tǒng)一管理變量 src-files
file(GLOB src-files
${CMAKE_SOURCE_DIR}/*.cpp # 原文件通配路徑
${CMAKE_SOURCE_DIR}/folder/*.cpp # 原文件通配路徑
)
#添加目標(biāo)庫
add_library(objName SHARED
${src-files})
# 導(dǎo)入頭文件
include_directories(include)
# 默認(rèn)自帶
find_library(log-lib log)
# 添加第三方庫(xxxx表示第三方庫別名)
add_library(xxxx SHARED IMPORTED )
# 設(shè)置 so庫路徑通用變量 jnilibs
set(jnilibs "${CMAKE_SOURCE_DIR}/../jniLibs")
# 設(shè)置第三方庫對應(yīng)的所在位置(xxxx表示第三方庫別名)
set_target_properties(xxxx PROPERTIES IMPORTED_LOCATION ${jnilibs}/${ANDROID_ABI}/libImSDK.so)
# 設(shè)置第三方庫統(tǒng)一管理變量 third-party-libs (xxxx表示第三方庫別名)
set(third-party-libs
xxxx
)
# 將目標(biāo)庫與第三方庫關(guān)聯(lián)
target_link_libraries(
imndkdemo
${log-lib}
${third-party-libs}
)