一、CMake简介
CMake是一个跨平台的编译工具,它可以生成与平台无关的makefile、Visual Studio等项目文件,快速轻松地构建和管理代码。CMake支持多种编程语言,包括C++、Java、Python等,并广泛应用于开发各种软件项目,例如OpenGL、Qt、Boost等库。
Android Studio从2.2版本开始支持使用CMake编译C/C++库,开发者可以使用CMake管理项目,在NDK中编译、构建和测试他们的本地代码,以及让他们的C++代码更容易地与Java代码合作。
二、使用CMake构建Android项目
在Android Studio中,创建一个C++库工程时,会自动生成CMakeLists.txt文件。
cmake_minimum_required(VERSION 3.4.1) #定义变量 set(my_src_path ${CMAKE_SOURCE_DIR}/src/main/cpp) set(my_lib_path ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}) #将目录下所有.cpp文件生成一个名为NativeFunc的库文件,并输出到libs目录下 add_library(NativeFunc SHARED ${my_src_path}/Add.cpp ${my_src_path}/Subtract.cpp ${my_src_path}/Multiply.cpp ${my_src_path}/Divide.cpp) #导入log库 find_library(log-lib log) #将libNativeFunc.so、log库打包到jniLibs目录下 target_link_libraries(NativeFunc ${log-lib}) set_target_properties(NativeFunc PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${my_lib_path})
在CMakeLists.txt中,首先设置一些变量,包括源码路径、静态库路径等;然后定义一个NativeFunc的共享库,并将所有.cpp源文件与它关联;最后链接log库、打包共享库到指定目录。
CMakeLists.txt的作用类似于Makefile,不同的是CMake可以跨平台生成不同类型的构建脚本。
三、使用CMake的高效方法
1. 使用变量
在CMakeLists.txt中,使用变量可以方便地管理路径、文件等复杂的参数。
set(my_src_path ${CMAKE_SOURCE_DIR}/src/main/cpp) set(my_include_path ${CMAKE_SOURCE_DIR}/src/main/cpp/include) set(my_lib_path ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI})
在代码中使用已定义的变量,代码可读性大大提高,同时也有利于维护。
add_library(NativeFunc SHARED ${my_src_path}/Add.cpp ${my_src_path}/Subtract.cpp ${my_include_path}/Multiply.cpp ${my_include_path}/Divide.cpp)
2. 使用函数
CMake提供一些函数库和宏,用于模块化的构建过程,例如字符串操作、文件操作、流控制等。
#在头文件目录中寻找include文件夹 include_directories(${my_include_path}) #加入头文件转换函数(将.cpp文件转为.h文件) function(convert_file_to_header file_name) get_filename_component(file_we ${file_name} NAME_WE) set(output_file "${my_include_path}/${file_we}.h") file(WRITE "${output_file}" "//在这里写你需要包含的.h头文件内容") endfunction() #调用convert_file_to_header函数,将Multiply.cpp转为Multiply.h convert_file_to_header(${my_src_path}/Multiply.cpp)
通过引用函数库、定义函数等方式,可以在CMakeLists.txt中编写更加灵活的脚本,提高项目的可扩展性和可维护性。
3. 定义参数
使用CMake,在构建Android项目时可以定义一些构建参数,例如定义编译器版本、CPU架构、编译选项等。这些参数可以在CMake脚本、源码中使用,方便地进行版本控制、多平台适配等工作。
#设置编译器版本 set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) #设置编译选项 add_compile_options(-Wall -Werror) #设置CPU架构 if(${ANDROID_ABI} STREQUAL "armeabi-v7a") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv7-a -mfpu=neon -mfloat-abi=softfp") endif()
通过定义参数,可以规范化项目的构建工作,提高开发效率和项目质量。
四、总结
CMake是一个方便、高效的跨平台编译工具,在Android Studio中使用CMake生成Android项目的makefile,可以更加轻松、便捷地编译、构建和管理代码。通过使用变量、函数、参数等工具,可以进一步提高CMake在Android开发中的灵活性和可维护性。