CMake有两个阶段:配置、生成。
cmake_minimum_required
(
VERSION [...] [FATAL_ERROR]
)
project
(
[...]
)
或
project
(
[VERSION [.[.[.]]]]
[DESCRIPTION ]
[HOMEPAGE_URL ]
[LANGUAGES ...]
)
VERSION |
cmake工程的版本号 |
DESCRIPTION |
cmake工程的简短的描述 |
HOMEPAGE_URL |
cmake工程的主页URL |
LANGUAGES |
cmake工程的编译工程使用的语言 |
使用该命令可以在:
它有两种命令格式
add_library
(
[STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
[source1] [source2] [...]
)
库文件的名字,该库文件会根据命令里列出的源文件来创建 | |
[STATIC | SHARED | MODULE] | 作用是指定生成的库文件的类型
注:如果没有明确指定要生成的library的类型到底是STATIC,SHARED还是MODULE。则查看BUILD_SHARED_LIBS变量,如果值为ON,则默认是SHARED,否则默认STATIC |
[EXCLUDE_FROM_ALL] | 表明该target是否从默认构建target中排除 |
[source1] [source2] [...] | source1 source2分别表示各个源文件 |
生成一个obj文件对象,该对象库只编译源文件,但不链接
add_library
(
OBJECT [
find_library
(
name1 [path1 path2 ...]
)
|
|
NAMES | 在NAMES参数后列出的文件名是要被搜索的库名 |
PATHS | 附加的搜索位置在PATHS参数后指定 |
target_link_libraries
(
[item1] [item2] [...][[debug|optimized|general] - ] ...
)
新建项目中会有CMakeLists.txt和native-lib.cpp两个文件
CMakeLists.txt中的内容
# 指定需要的 CMake 最低版本为 3.22.1
cmake_minimum_required(VERSION 3.22.1)
# 指定项目名称为 "mysocreatefile"
project("mysocreatefile")
# 添加一个名为 "mysocreatefile" 的共享库,并将 "native-lib.cpp" 源文件添加到库中
# 这里使用 SHARED 标志表示这是一个共享库(动态链接库)
add_library(
mysocreatefile
SHARED
native-lib.cpp
)
# 查找名为 "log" 的库,并将其路径保存在变量 log-lib 中
# 这是为了在后面的步骤中将这个库链接到目标库
find_library(
log-lib
log
)
# 将目标库 "mysocreatefile" 与 log-lib 变量中的库链接起来。
# 这意味着在编译和链接过程中,将使用 "log" 库提供的功能和符号
target_link_libraries(
mysocreatefile
${log-lib}
)
native-lib.cpp中的内容,即C++要执行的代码
#include
#include
extern "C" JNIEXPORT jstring JNICALL
Java_com_leon_mysocreatefile_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
MainActivity中的内容
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.sampleText.text = stringFromJNI()
}
external fun stringFromJNI(): String
companion object {
init {
System.loadLibrary("mysocreatefile")
}
}
}
build.gradle(:app)中,android{}目录中会有cmake的配置
我们可以Make一下项目,看一下示例生成的.so
定义一个external方法
# 指定需要的 CMake 最低版本为 3.22.1
cmake_minimum_required(VERSION 3.22.1)
# 指定项目名称为 "myscorelib"
project("myscorelib")
# 添加一个名为 "myscorelib" 的共享库,并将 "score-lib.cpp" 源文件添加到库中
# 这里使用 SHARED 标志表示这是一个共享库(动态链接库)
add_library(
myscorelib
SHARED
score-lib.cpp
)
# 查找名为 "log" 的库,并将其路径保存在变量 log-lib 中
# 这是为了在后面的步骤中将这个库链接到目标库
find_library(
log-lib
log
)
# 将目标库 "myscorelib" 与 log-lib 变量中的库链接起来。
# 这意味着在编译和链接过程中,将使用 "log" 库提供的功能和符号
target_link_libraries(
myscorelib
${log-lib}
)
package com.leon.score
class ScoreTool {
companion object{
init {
System.loadLibrary("myscorelib")
}
}
external fun evaluateLevel(score: Int): String
}
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
//评定分数等级
val score = 50
val level = ScoreTool().evaluateLevel(score)
//展示结果
binding.sampleText.text = "得分:$score\n等级:$level"
}
}
android {
...
sourceSets{
main{
jniLibs.srcDirs = ['libs']
}
}
defaultConfig {
...
ndk {
// 设置支持的SO库架构
abiFilters 'arm64-v8a', 'armeabi-v7a', 'x86', 'x86_64'
}
}
}
CMake概念
CMake命令
OOM