1. 程式人生 > >關於androidstudio cmake那些事兒(一)

關於androidstudio cmake那些事兒(一)

關於在as上使用cmake開發NDK,還沒有比較詳細統一的資料,就個人踩過的一些坑記一下,我們在android NDK開發的時候大部分是在windows下面進行開發,在windows下面編譯用標準c++庫的一些檔案,然後又要編譯成so的時候,這個時候就比較坑了。
檔案之多,比較亂,還有的時候一些檔案並不需要編譯成so。。。不過,使用cmake比mk編譯還是爽一些,至少新增c檔案不用一個一個的寫。
一,新增檔案非常暴力。
file(GLOB_RECURSE cpp_list ./*.cpp) 這個file命令,使用GLOB_RECURSE引數的時候即表示遞迴搜尋的意思,上面這句話的意思是遞迴搜尋當前目錄及其子目錄下的所有.cpp檔案,把其完整路徑放入列表cpp_list中。夠暴力吧,file還有很多指令。比如READ,WRITE,RENAME,等等不一一介紹了,
include_directories( BEFORE SYSTEM ,

)新增標頭檔案,這個會連同子目錄的都會新增。
好了,我的專案有個需求,有一些模組,有些模組下面的一些檔案也不需要新增進去,要是哪一天需求又變了,這個又要加進去。一個一個檔案的新增,修改的人多了,會亂的,如果說NDK有多個人開發,還是自己維護自己的模組比較好。

macro( add_submodule dir )
    set( options )
    set( oneValueArgs )
    set( multiValueArgs EXHEADERS )
    cmake_parse_arguments( add_submodule "" "" "${multiValueArgs}"
${ARGN} ) #message( STATUS "{dir} ${dir}" ) #message( STATUS "{add_submodule_UNPARSED_ARGUMENTS} ${add_submodule_UNPARSED_ARGUMENTS}" ) foreach( name ${add_submodule_UNPARSED_ARGUMENTS} ) set( LIBSRC ${LIBSRC} ${dir}/${name} ) endforeach( name ) #message( STATUS "{add_submodule_EXHEADERS} ${add_submodule_EXHEADERS}" )
foreach( name ${add_submodule_EXHEADERS} ) set( EXHEADERS ${EXHEADERS} ${dir}/${name} ) endforeach( name ) endmacro( add_submodule )
add_submodule(dirName a.cpp b.cpp
   EXHEADERS a.h b.h )

定義這個之後,以後新增自己的模組使用上面一句就可以了,關於cmake_parse_arguments(https://cmake.org/cmake/help/latest/command/cmake_parse_arguments.html),例如上面第一個引數是以add_submodule為字首,第二個options(為“”),第三個oneValueArgs(為“”),第四個multiValueArgs(為EXHEADERS)
後面的迴圈就是把.cpp(.c)檔案新增到LIBSRC變數中去,把標頭檔案新增到EXHEADERS中去。
好了,選擇檔案編譯就差不多了。

二,NDK內部庫的引用
我們新建專案時,都會預設引用一個log-lib庫。

find_library( # Sets the name of the path variable.
              log-lib
              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )

我現在想的是,我怎麼知道有什麼lib庫,去哪兒找。答案就在E:\softinstall\sdk\ndk-bundle\platforms\android-12\arch-arm\usr\lib下面(NDK的目錄),
這裡寫圖片描述
看到那個liblog.so了吧。