Android NDK 之CmakeList 笔记
前言:
在android ndk 開發中,是經常需要通過cmakelist 來配置 引入庫或者編譯配置的。這里總結一些常用的cmakelist 中api 語法。
1.add_library 添加庫
c++庫:靜態庫(.a、.lib)和動態庫(.so、.dll),更多詳情,請度娘。
1.1添加已經編譯好的so庫
#添加 libavcodec-56.so 庫 add_library(avcodec-libSHAREDIMPORTED) set_target_properties( avcodec-libPROPERTIES IMPORTED_LOCATION${distribution_DIR}/${ANDROID_ABI}/libavcodec-56.so)-
add_library(): 第一個參數avcodec-lib 是庫的別名,第二個參數SHARED是庫類型,這里是動態庫。第三個參數IMPORTED是引入方式,這里是導入,通常是默認這個。
-
set_target_propeties() 中:第一個參數avcodec-lib 是庫的別名 , 第二個參數PROPERTIES IMPORTED_LOCATION是指定引入方式,這里是本地引入。第三個參數${distribution_DIR}/${ANDROID_ABI}/libavcodec-56.so 是so庫的路徑。
因此,引入第三方的庫使用add_library就要使用set_target_propeties這個組合。
1.2 添加c/c++ 源代碼編譯的庫:
#添加一個名為webp_view的動態庫,指定包含 webp_decode.cpp和webp_view.cpp文件。 add_library(webp_view SHAREDwebp_decode.cppwebp_view.cpp)這種方式是添加c/c++源碼文件,這種不需要使用set_target_propeties()去設置路徑。第一個參數webp_view: 是庫名字,第二個參數shared: 是動態庫,第三個參數webp_decode.cpp webp_view.cpp 是需要參與編譯的源文件。
2.find_library 查找庫
用于查找使用android ndk 中系統庫,比如 打印日志log庫。
#查找log庫,且重新別名為log-lib find_library( log-lib log )第一個參數log-lib : 重新定義log庫的別名 ,第二個參數log : 需要使用庫的庫名。
3. set 設置變量
用于顯示的聲明一個變量,比如定義一個變量,其地址是根目錄下的libwebp 目錄。
# web_simple_proj_dir=項目root目錄的絕對路徑 get_filename_component(WEBP_SAMPLE_PROJ_DIR${CMAKE_CURRENT_SOURCE_DIR}/../../../.. ABSOLUTE)# 設置webp_src_dir(即libwebp的目錄地址)= 項目root目錄/libwebp set(WEBP_SRC_DIR ${WEBP_SAMPLE_PROJ_DIR}/libwebp)也可以設置cmake 中的一些配置:
設置c++ 11的版本:
# 使用c++11 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall")設置c 99 的版本:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")更改so庫中一些輸出路徑: 比如輸出在在app/src/main下看到jniLibs目錄下
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI})4. include_directories 導入頭文件
4.1 include_directories:
當前CMakeList.txt中的所有目標以及所有在其調用點之后添加的子目錄中的所有目標將具有此頭文件搜索路徑。
#導入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…])
指定目標tagert 包含的頭文件路徑。
- INTERFACE:target對應的頭文件使用
- PRIVATE:target對應的源文件使用
- PUBLIC:target對應的頭文件、源文件都使用
ps:如果有不同目錄相同名稱的頭文件會產生影響,所以這里建議針對特定的target進行添加頭文件的操作,不要使用include_directories
5.link_libraries 關聯需鏈接的庫
在linux中c/c++的編譯一般都是用gcc來編譯的,c/c++編譯時會產生.o文件要通過make工具來把這些.o文件鏈接起來,這樣才能得一個可執行程序。所以.so在編譯時要把所有庫鏈接起來才能編。
target_link_libraries 是為了關聯我們自己的庫和一些第三方庫或者系統庫。把要鏈接的庫別名都寫到這里就可以了,如果是系統的庫要用這個格式${庫的名字},比如:
# 為webp_view 添加各種依賴庫 target_link_libraries(webp_view android log m native_app_glue webp)6.add_subdirectory 添加其他cmakelist 編譯
在實際開發中,項目可能還包含其他子項目(使用一些開源庫的源碼)的編譯,這時需要指定子項目的cmakelist 參與編譯。
#調用libwebp module 下 CamkeList.txt add_subdirectory(${WEBP_SRC_DIR} ${WEBP_SRC_DIR}/build/)add_subdirectory() 是可以引入多個需要編譯的cmakelist 的目錄。這里webp_src_dir 在3.set設置變量中定義好的路徑=項目root目錄/libwebp。
7.一個谷歌官方的webp 的cmakelist 案例:
先看下webp lib庫的目錄結構:
接著看下app工程 的目錄結構:
最后看下app module中完整cmakelist :
# 使用camke 的版本 cmake_minimum_required(VERSION 3.4.1) set(CMAKE_VERBOSE_MAKEFILE on)# 定義一個變量web_simple_proj_dir=項目root目錄的絕對路徑 get_filename_component(WEBP_SAMPLE_PROJ_DIR${CMAKE_CURRENT_SOURCE_DIR}/../../../.. ABSOLUTE)# 設置webp_src_dir(即libwebp的目錄地址)= 項目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) ,執行 從谷歌倉庫拷貝 libwebp 1.0.0版本 到webp_src_dir的目錄下。 # 或者通過AndroidStudio import 導入方式導入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)#調用libwebp module 下 CamkeList.txt add_subdirectory(${WEBP_SRC_DIR} ${WEBP_SRC_DIR}/build/)# build native_app_glue as a static lib # 導入ndk路徑/source/android/native_app_glue 目錄下的頭文件 include_directories(${ANDROID_NDK}/sources/android/native_app_glue) #添加一個名為native_app_glue的靜態庫,包含的文件有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的動態庫,指定包含 webp_decode.cpp和webp_view.cpp文件。 add_library(webp_view SHAREDwebp_decode.cppwebp_view.cpp) # 為web_view 導入指定的頭文件( private 限定是源文件才可以使用導入的頭文件)。 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)總結
以上是生活随笔為你收集整理的Android NDK 之CmakeList 笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python迭代器转list
- 下一篇: java替换sorce包的代码