日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android NDK 之CmakeList 笔记

發(fā)布時間:2023/12/31 Android 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android NDK 之CmakeList 笔记 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

在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)的頭文件、源文件都使用
# 為web_view 導(dǎo)入指定的頭文件( private 限定是源文件才可以使用導(dǎo)入的頭文件)。 target_include_directories(webp_view PRIVATE${WEBP_SRC_DIR}/examples${WEBP_SRC_DIR}/src)

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。