Android NDK 之CmakeList 笔记
前言:
在android ndk 開發(fā)中,是經(jīng)常需要通過cmakelist 來配置 引入庫或者編譯配置的。這里總結(jié)一些常用的cmakelist 中api 語法。
1.add_library 添加庫
c++庫:靜態(tài)庫(.a、.lib)和動態(tài)庫(.so、.dll),更多詳情,請度娘。
1.1添加已經(jīng)編譯好的so庫
#添加 libavcodec-56.so 庫 add_library(avcodec-libSHAREDIMPORTED) set_target_properties( avcodec-libPROPERTIES IMPORTED_LOCATION${distribution_DIR}/${ANDROID_ABI}/libavcodec-56.so)-
add_library(): 第一個參數(shù)avcodec-lib 是庫的別名,第二個參數(shù)SHARED是庫類型,這里是動態(tài)庫。第三個參數(shù)IMPORTED是引入方式,這里是導(dǎo)入,通常是默認(rèn)這個。
-
set_target_propeties() 中:第一個參數(shù)avcodec-lib 是庫的別名 , 第二個參數(shù)PROPERTIES IMPORTED_LOCATION是指定引入方式,這里是本地引入。第三個參數(shù)${distribution_DIR}/${ANDROID_ABI}/libavcodec-56.so 是so庫的路徑。
因此,引入第三方的庫使用add_library就要使用set_target_propeties這個組合。
1.2 添加c/c++ 源代碼編譯的庫:
#添加一個名為webp_view的動態(tài)庫,指定包含 webp_decode.cpp和webp_view.cpp文件。 add_library(webp_view SHAREDwebp_decode.cppwebp_view.cpp)這種方式是添加c/c++源碼文件,這種不需要使用set_target_propeties()去設(shè)置路徑。第一個參數(shù)webp_view: 是庫名字,第二個參數(shù)shared: 是動態(tài)庫,第三個參數(shù)webp_decode.cpp webp_view.cpp 是需要參與編譯的源文件。
2.find_library 查找?guī)?/strong>
用于查找使用android ndk 中系統(tǒng)庫,比如 打印日志log庫。
#查找log庫,且重新別名為log-lib find_library( log-lib log )第一個參數(shù)log-lib : 重新定義log庫的別名 ,第二個參數(shù)log : 需要使用庫的庫名。
3. set 設(shè)置變量
用于顯示的聲明一個變量,比如定義一個變量,其地址是根目錄下的libwebp 目錄。
# web_simple_proj_dir=項(xiàng)目root目錄的絕對路徑 get_filename_component(WEBP_SAMPLE_PROJ_DIR${CMAKE_CURRENT_SOURCE_DIR}/../../../.. ABSOLUTE)# 設(shè)置webp_src_dir(即libwebp的目錄地址)= 項(xiàng)目root目錄/libwebp set(WEBP_SRC_DIR ${WEBP_SAMPLE_PROJ_DIR}/libwebp)也可以設(shè)置cmake 中的一些配置:
設(shè)置c++ 11的版本:
# 使用c++11 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall")設(shè)置c 99 的版本:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")更改so庫中一些輸出路徑: 比如輸出在在app/src/main下看到j(luò)niLibs目錄下
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI})4. include_directories 導(dǎo)入頭文件
4.1 include_directories:
當(dāng)前CMakeList.txt中的所有目標(biāo)以及所有在其調(diào)用點(diǎn)之后添加的子目錄中的所有目標(biāo)將具有此頭文件搜索路徑。
#導(dǎo)入ndk 中native_app_glue目錄下的頭文件 include_directories(${ANDROID_NDK}/sources/android/native_app_glue)4.2 target_include_directories
格式:target_include_directories(<target> [SYSTEM] [AFTER|BEFORE] <INTERFACE|PUBLIC|PRIVATE> [items1…])
指定目標(biāo)tagert 包含的頭文件路徑。
- INTERFACE:target對應(yīng)的頭文件使用
- PRIVATE:target對應(yīng)的源文件使用
- PUBLIC:target對應(yīng)的頭文件、源文件都使用
ps:如果有不同目錄相同名稱的頭文件會產(chǎn)生影響,所以這里建議針對特定的target進(jìn)行添加頭文件的操作,不要使用include_directories
5.link_libraries 關(guān)聯(lián)需鏈接的庫
在linux中c/c++的編譯一般都是用gcc來編譯的,c/c++編譯時會產(chǎn)生.o文件要通過make工具來把這些.o文件鏈接起來,這樣才能得一個可執(zhí)行程序。所以.so在編譯時要把所有庫鏈接起來才能編。
target_link_libraries 是為了關(guān)聯(lián)我們自己的庫和一些第三方庫或者系統(tǒng)庫。把要鏈接的庫別名都寫到這里就可以了,如果是系統(tǒng)的庫要用這個格式${庫的名字},比如:
# 為webp_view 添加各種依賴庫 target_link_libraries(webp_view android log m native_app_glue webp)6.add_subdirectory 添加其他cmakelist 編譯
在實(shí)際開發(fā)中,項(xiàng)目可能還包含其他子項(xiàng)目(使用一些開源庫的源碼)的編譯,這時需要指定子項(xiàng)目的cmakelist 參與編譯。
#調(diào)用libwebp module 下 CamkeList.txt add_subdirectory(${WEBP_SRC_DIR} ${WEBP_SRC_DIR}/build/)add_subdirectory() 是可以引入多個需要編譯的cmakelist 的目錄。這里webp_src_dir 在3.set設(shè)置變量中定義好的路徑=項(xiàng)目root目錄/libwebp。
7.一個谷歌官方的webp 的cmakelist 案例:
先看下webp lib庫的目錄結(jié)構(gòu):
接著看下app工程 的目錄結(jié)構(gòu):
最后看下app module中完整cmakelist :
# 使用camke 的版本 cmake_minimum_required(VERSION 3.4.1) set(CMAKE_VERBOSE_MAKEFILE on)# 定義一個變量web_simple_proj_dir=項(xiàng)目root目錄的絕對路徑 get_filename_component(WEBP_SAMPLE_PROJ_DIR${CMAKE_CURRENT_SOURCE_DIR}/../../../.. ABSOLUTE)# 設(shè)置webp_src_dir(即libwebp的目錄地址)= 項(xiàng)目root目錄/libwebp set(WEBP_SRC_DIR ${WEBP_SAMPLE_PROJ_DIR}/libwebp)# clone the dependency repo. # git submodule could also be used if this sample does not need # Android Studio's "Import Android code sample" option# 若是不存在libwebp module(即不存在libwebp 目錄或者libwebp/CMakeLists.txt) ,執(zhí)行 從谷歌倉庫拷貝 libwebp 1.0.0版本 到webp_src_dir的目錄下。 # 或者通過AndroidStudio import 導(dǎo)入方式導(dǎo)入libwebp module源碼 if ((NOT EXISTS ${WEBP_SRC_DIR}) OR(NOT EXISTS ${WEBP_SRC_DIR}/CMakeLists.txt))execute_process(COMMAND git clone -b 1.0.0https://chromium.googlesource.com/webm/libwebplibwebpWORKING_DIRECTORY ${WEBP_SAMPLE_PROJ_DIR}/) endif()SET(WEBP_ENABLE_SWAP_16BIT_CSP ON CACHE BOOL"Enable byte swap for 16 bit colorspaces." FORCE)#調(diào)用libwebp module 下 CamkeList.txt add_subdirectory(${WEBP_SRC_DIR} ${WEBP_SRC_DIR}/build/)# build native_app_glue as a static lib # 導(dǎo)入ndk路徑/source/android/native_app_glue 目錄下的頭文件 include_directories(${ANDROID_NDK}/sources/android/native_app_glue) #添加一個名為native_app_glue的靜態(tài)庫,包含的文件有ndk路徑/source/android/native_app_glue.c add_library(native_app_glue STATIC${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c)# 使用c99 版本 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99") # 使用c++11 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall")# Export ANativeActivity_onCreate(),# Refer to: https://github.com/android-ndk/ndk/issues/381. set(CMAKE_SHARED_LINKER_FLAGS"${CMAKE_SHARED_LINKER_FLAGS} -u ANativeActivity_onCreate")#添加一個名為webp_view的動態(tài)庫,指定包含 webp_decode.cpp和webp_view.cpp文件。 add_library(webp_view SHAREDwebp_decode.cppwebp_view.cpp) # 為web_view 導(dǎo)入指定的頭文件( private 限定是源文件才可以使用導(dǎo)入的頭文件)。 target_include_directories(webp_view PRIVATE${WEBP_SRC_DIR}/examples${WEBP_SRC_DIR}/src)# 為webp_view 添加各種依賴庫 target_link_libraries(webp_view android log m native_app_glue webp)總結(jié)
以上是生活随笔為你收集整理的Android NDK 之CmakeList 笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python迭代器转list
- 下一篇: Android 文本比较 APP,一个a