1、CMake工具 1.1、CMake是什么 CMake是一个主要用于CPP的构建工具。CMake语言是平台无关的中间编译工具。同一个CMake编译规则在不同系统平台构建出不同的可执行构建文件,所有操作都是通过编译CMakeLists.tx
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.1cmake_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 JNICALLJava_com_leon_mysocreatefile_MainActivity_stringFromJNI( JNIEnv* env, jobject ) { 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.1cmake_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.scoreclass 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' } } }
OOM
来源地址:https://blog.csdn.net/weixin_41733225/article/details/131521373
--结束END--
本文标题: Android Studio利用CMake生成.so文件并且可供其他项目引用
本文链接: https://lsjlt.com/news/402478.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-01-21
2023-10-28
2023-10-28
2023-10-27
2023-10-27
2023-10-27
2023-10-27
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0