一、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開發中的靈活性和可維護性。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/282901.html