android开发cmake编译多个有相互依赖的c/cpp模块源代码的配置方法

android开发cmake编译多个有相互依赖的c/cpp模块源代码的配置方法

1. 项目目录结构配置如下:

root-project	//根目录直接引用根目录下的CMakeLists
	cpp1Project
		/src/main/c/CMakeLists.txt //cpp1的
	cpp2Project
		/src/main/cpp/CMakeLists.txt //cpp2的
	CMakeLists.txt //根目录的,它将引用cpp1Project和cpp2Project下的CMakeLists.txt文件

2. root-project根目录下的build.gradle配置如下:

defaultConfig {
        externalNativeBuild {
            cmake {
                arguments '-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=c++_shared', '-DCMAKE_VERBOSE_MAKEFILE=ON'  //-D是传递编译参数,如-DVERBOSE=1打开cmake编译log开关
                cppFlags '-Wl,--gc-sections', '-fno-exceptions', '-fno-rtti', '-fvisibility=hidden'
                cFlags '-Wl,--gc-sections', '-fvisibility=hidden'  //上面两行Flags配置是sections节区优化配置
                abiFilters = ["armeabi-v7a"]	//指定编译的abi类似
            }
        }
    }
externalNativeBuild {
        cmake {
            path "CMakeLists.txt" //引用根目录下的CMakeLists.txt
        }
    }
ndk{
	abiFilters = ["armeabi-v7a"]	//指定打包的abi类似,和指定编译的abi类似有点不一样哦
}
//注意:如果cpp1Project想单独编译自己的c源代码,也可以配置类似root-project下的build.gradle配置

3. root-project根目录下的CMakeLists.txt配置如下:

cmake_minimum_required(VERSION 3.4.1)
//就那么多配置,包含root-project根目录下两个子项目的CMakeLists.txt所在的目录。
//cmake会自动找到并该目录下的CMakeLists.txt文件并执行
add_subdirectory(cpp1Project/src/main/c)
add_subdirectory(cpp2Project/src/main/cpp)

4. cpp1Project下生成libhook.a静态库的CMakeLists.txt文件配置如下:

cmake_minimum_required(VERSION 3.4.1)
project(hook C)		//指定为c项目,类似有project(hook CXX C ASM)	
set(hook_source_dir ${CMAKE_CURRENT_SOURCE_DIR})	//定义变量hook_source_dir
set(hook_source
        ${hook_source_dir}/core.c
        ${hook_source_dir}/hook.c
   		...)	//定义变量hook_source	也可以使用file GLOB搞定
add_library(hook STATIC ${hook_source})		//生成libhook.a静态库,也可以使用SHARED生成动态库
find_library(log-lib log)//查找系统目录(\21.4.7075529\platforms\android-21\arch-arm\usr\lib)下的liblog.so库,取名为log-lib
//target_include_directories与include_directories区别(适用范围不同):
//target_include_directories包含的头文件使用范围仅限与当前目标或者说当前目录
//include_directories包含的头文件,子目标或者说子目录也可以使用到,如果根目录下使用了那就子目录也有效,注意不能滥用
target_include_directories(hook PUBLIC ${hook_source_dir}) //包含头文件,不同于include_directories
target_link_libraries(xhook ${log-lib})	//链接上面find到的log-lib库

5. cpp2Project下生成libtrace.so动态库(依赖libhook.a静态库)的CMakeLists.txt文件配置如下:

cmake_minimum_required(VERSION 3.4.1)

project(trace CPP)

include_directories(
        ${CMAKE_SOURCE_DIR}
)
//cpp2Project使用cpp1Project下的头文件
//或者target_include_directories(trace PUBLIC ${CMAKE_SOURCE_DIR}/cpp1Project/src/main/c/hook/),不过要放在add_library(trace ...)后面,因为生成了target才能找到trace目标
include_directories(${CMAKE_SOURCE_DIR}/cpp1Project/src/main/c/hook/)

add_library(trace SHARED  Trace.cc) //生成libtrace.so动态库
target_link_libraries(trace		//将log库和hook库链接到目标trace
	log				//链接系统目录下的liblog.so动态库,不用指定前缀lib和后缀.so会自动匹配
	hook)				//链接上面cpp1Project生成的libhook.a静态库,不用指定前缀lib和后缀.a会自动匹配
posted @ 2022-05-13 16:56  yongfengnice  阅读(1344)  评论(0编辑  收藏  举报