# 版本
cmake_minimum_required(VERSION 3.4.1)
# 添加庫(kù) 和 源文件
add_library(
# 最終生成的名字 lib + native-lib .so
native-lib
# 明確指定是動(dòng)態(tài)庫(kù)
SHARED
# 很多的源文件 或者有一次添加所有源文件
native-lib.cpp
)
# 變量指定 引用庫(kù)
find_library(
log-lib
# 這個(gè)是變量名 和下面的 ${log-lib} 用的是一個(gè)變量,用的是log庫(kù)
# /android-ndk-r17c/platforms/android-28/arch-arm/usr/lib
# 下面的log是什么意思 liblog.so == log
log)
# 引入頭文件等一些庫(kù)
target_link_libraries(
native-lib
${log-lib}) # 這個(gè)log-lib 就是上面的庫(kù)位置
添加靜態(tài)動(dòng)態(tài)庫(kù)
步驟
1激挪、加入靜/動(dòng)態(tài)庫(kù)
2辰狡、導(dǎo)入靜/動(dòng)態(tài)庫(kù)
3、引用靜/動(dòng)態(tài)庫(kù)
注意
1垄分、so動(dòng)態(tài)庫(kù)的加入宛篇,默認(rèn)需要在和java同級(jí)別的目錄下,創(chuàng)建jniLibs目錄薄湿,下面再是x86/armeabi-v7a 目錄 叫倍,再下來(lái)是so文件。
2豺瘤、動(dòng)態(tài)庫(kù)加入后吆倦,直接運(yùn)行,第一次會(huì)報(bào)錯(cuò)坐求,因?yàn)镾ystem.loadLibrary是總的so蚕泽,如果so中還加入別的so,需要再總的前面先進(jìn)行
static {
System.loadLibrary("get"); // 先引用so中引用的so 要么會(huì)找不到這個(gè)so
System.loadLibrary("native-lib"); // 總的so
}
cmake_minimum_required(VERSION 3.4.1)
# 添加庫(kù) 和 源文件
add_library(
native-lib
SHARED
native-lib.cpp) # 加入源文件桥嗤,不需要加h 文件 加了就出錯(cuò)
# 批量引入圓文件
file(GLOB allCpp *.cpp)
##1须妻、加入入靜態(tài)庫(kù)
#add_library(
# get
# STATIC IMPORTED
#)
## 2、導(dǎo)入靜態(tài)庫(kù)
#set_target_properties(
# get PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/libget.a
#)
# 1泛领、加入動(dòng)態(tài)庫(kù)
add_library(
get
SHARED IMPORTED
)
# 2荒吏、導(dǎo)入動(dòng)態(tài)庫(kù)
set_target_properties(
get
PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/../jniLibs/${CMAKE_ANDROID_ARCH_ABI}/libget.so
)
# 變量指定 引用的庫(kù),下面引用庫(kù)的時(shí)候渊鞋,直接引用變量
find_library(
log-lib
log)
# 3绰更、引用
target_link_libraries( # Specifies the target library.
native-lib
get
${log-lib}) # 這個(gè)log庫(kù),是根據(jù)gradle 最小版本來(lái)定篓像,最小版本多少动知,他就是多少的庫(kù)
C/C++ 交叉運(yùn)行
如果so是用C寫的,在引用的時(shí)候员辩,就不能直接引用盒粮,需要
// 因?yàn)槭莄寫的.a 現(xiàn)在是c++調(diào)用,會(huì)有問(wèn)題
//extern int get();
extern "C" {
int get();
}
// 這樣在C++代碼中奠滑,才能直接get so中的方法
Gradle
externalNativeBuild {
cmake {
// cppFlags "" 打包默認(rèn)包含4大平臺(tái)
abiFilters 'x86' //指定使用什么平臺(tái) 編譯
}
}