CMake 構建項目Android NDK項目基礎知識

本篇文章將介紹如何使用 CMake 構建實現你的第一個 NDK 項目。 ##前言 你好!歡迎來到我的的學習筆記分享系列,第一次給大家分享的是 Android NDK 開發的學習筆記,讓我們先開始了解 NDK 的構建方式吧! NDK 構建方式有兩種,一種是 ndk-build,另一種是 CMake,從 Android Studio 2.2 開始,Android Sudio 默認地使用 CMake 作為 NDK 項目的構建工具,本文將先介紹如何使用 CMake 來構建你的第一個 NDK 項目。

關于NDK

什么是NDK

NDK 全稱是 Native Development Kit,是一組可以讓你在 Android 應用中編寫實現 C/C++ 的工具,可以在項目用自己寫源代碼構建,也可以利用現有的預構建庫。

為什么要使用NDK

NDK 對許多類型的 Android 應用沒什么價值。 因為它不可避免地會增加開發過程的復雜性,但在一些情況下卻可能很有用或者是必須的,下面列舉一些 NDK 的使用目的:

  • 從設備獲取更好的性能以用于計算密集型應用,例如游戲或物理模擬
  • 重復使用自己或其他開發者的 C/C++ 庫,便利于跨平臺。
  • NDK 集成了譬如 OpenSLVulkan 等 API 規范的特定實現,以實現在 java 層無法做到的功能如提升音頻性能等
  • 增加反編譯難度

NDK 下載

可以直接通過 Android Studio >> SDK Manager >> SDK Tools 來下載最新的 NDK 包

下載后所在目錄是 $(你的sdk目錄)/ndk-bundle,里面有很多重要的工具如 ndk-buildndk-gdb 等,之后會再做介紹。當然,你也可以:

  • 下載過往版本的 NDK 包
  • 查看 NDK 修訂歷史記錄

關于 CMake

什么是 CMake

CMake 是一個開源的跨平臺工具系列,旨在構建,測試和打包軟件。CMake用于使用簡單的平臺和獨立于編譯器的配置文件來控制軟件編譯過程,并生成可在選擇的編譯器環境中使用的本機makefile和工作空間。簡單點說,CMake 是一款外部構建工具,從 Android Studio 2.2 開始,Android Sudio 默認地使用 CMakeGradle 搭配使用來構建原生庫。

CMake 下載

和在 Android Studio 中下載 NDK 一樣,可以直接通過 Android Studio >> SDK Manager >> SDK Tools 來下載 CMake:

當然,你也可以:

  • 進一步了解 CMake

使用 CMake 構建 NDK 項目

創建 NDK 項目

了解一些基礎概念之后,接下來是創建一個 Demo,一步步地來看一下使用 CMake 構建的 NDK 項目里面有什么: 首先是在 Android Studio(2.2以上) 中創建一個新的項目,勾選上 Include C++ support,本文介紹將使用 Kotlin

然后一直往下,在自定義 C++ Support 界面保持 Toolchain Default 即可

項目創建了之后,你會在 Project 目錄視圖下,發現比普通的創建新項目多了幾個文件:cpp目錄里是默認生成的 cpp 文件,CMakeLists.txt 為 CMake 構建腳本。

點開 app 層級下的 build.gradle 文件,會發現多出如下部分:

這就是前文提到的在 Gradle 使用 CMake 配置為外部構建,.externalNativeBuild 文件因此生成,其中 path 指定了構建腳本的路徑。還可以補充其他參數信息,可查閱:

  • CMake 參數詳細信息

CMakeList.txt

讓我們來一步步分析默認生成的 CMakeList.txt 里包含了哪些信息——

  • cmake_minimum_required() 首先開頭部分 cmake_minimum_required() 定義了所需 CMake的最低版本。
cmake_minimum_required(VERSION 3.4.1)
復制代碼
  • add_library() add_library() 命令用來添加庫native-lib 對應著生成的庫的名字,SHARED 代表為分享庫,src/main/cpp/native-lib.cpp 則是指明了源文件的路徑。
add_library( # Sets the name of the library.native-lib# Sets the library as a shared library.SHARED# Provides a relative path to your source file(s).src/main/cpp/native-lib.cpp)
復制代碼
  • find_library() 將?find_library()命令添加到 CMake 構建腳本中以定位 NDK 庫,并將其路徑存儲為一個變量。可以使用此變量在構建腳本的其他部分引用 NDK 庫,下面的代碼則是定位?Android 特定的日志支持庫并將其路徑存儲在?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)
復制代碼

注:預構建的 NDK 庫已經存在于 Android 平臺上,因此,無需再構建或將其打包到 APK 中。由于 NDK 庫已經是 CMake 搜索路徑的一部分,甚至不需要在 NDK 安裝中指定庫的位置,只需要向 CMake 提供你希望使用的庫的名稱,并將其關聯到自己的原生庫中。

  • target_link_libraries() 要將預構建庫關聯到自己的原生庫,則將其添加到以下的 target_link_libraries() 命令中:
target_link_libraries( # Specifies the target library.native-lib# Links the target library to the log library# included in the NDK.${log-lib})
復制代碼

當然,你也可以查看:

  • Android NDK 原生 API
  • CMake 命令詳細信息文檔

編譯

編譯生成的apk里,就會找對應名稱.so庫文件啦:

  • 項目的源碼已上傳到Github

本文為個人原創,轉載請注明出處。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276512.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276512.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276512.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux installaccess Nessus-5.2.4

1、Download: http://www.tenable.com/products/nessus/select-your-operating-system 2、Current version:Nessus-5.2.4-debian6_i386.deb 3、Install:dpkg -i Nessus-5.2.4-debian6_i386.deb # dpkg -i Nessus-5.2.4-debian6_i386.deb Selecting p…

面試官問:JS的繼承

原文作者若川,掘金鏈接:https://juejin.im/post/5c433e216fb9a049c15f841b寫于2019年2月20日,現在發到公眾號聲明原創,之前被《前端大全》公眾號等轉載閱讀量超1w,知乎掘金等累計閱讀量超過1w。導讀:文章主…

qt 快速按行讀取文件_這是知識點之Linux下分割文件并保留文件頭

點擊上方"開發者的花花世界",選擇"設為星標"技術干貨不定時送達!這是一個知識點方便快捷的給結構化數據文件分割大小并保留文件的表頭,幾十個G的結構化文件不僅閱讀編輯麻煩,而且使用受限,因此高效…

mono 調用windows webService

1. 實現linux mono Develop中調用windows 中的webService l linux 與 windows 在一個局域網的網段中 l windows 的IIs中發布webService 2. windows 中的設置 l webService 的代碼 using System; using System.Collections.Generic; using System.Linq; using S…

Linux 內存機制

轉載鏈接:http://blog.csdn.net/tianlesoftware/article/details/5463790 一. 內存使用說明 Free 命令相對于top 提供了更簡潔的查看系統內存使用情況: [rootrac1 ~]# free total used free shared buffers cached Mem: …

network中的請求信息,headers中的每一項分別是什么意義?

這里是修真院前端小課堂,每篇分享文從 【背景介紹】【知識剖析】【常見問題】【解決方案】【編碼實戰】【擴展思考】【更多討論】【參考文獻】 八個方面深度解析前端知識/技能,本篇分享的是: 【network中的請求信息,headers中的每…

學習 sentry 源碼整體架構,打造屬于自己的前端異常監控SDK

前言這是學習源碼整體架構第四篇。整體架構這詞語好像有點大,姑且就算是源碼整體結構吧,主要就是學習是代碼整體結構,不深究其他不是主線的具體函數的實現。文章學習的是打包整合后的代碼,不是實際倉庫中的拆分的代碼。其余三篇分…

巴西龜吃什么

1、活蝦,哈哈,巴西龜最喜歡的食物,超市很多雞尾蝦買的,就那種,要活的,鍛煉它們的天性,一次一只可以吃一、兩天; 2、蚶子,貝殼類,活的,整個扔進去&…

綁定dictionary 給定關鍵字不再字典中_VBA代碼集錦-利用字典做兩列數據的對比并對齊...

源數據:代碼:Sub 對比()Dim arr, brr, crrDim i, j, n, lastrowA, lastrowB As Integer建立字典對象Set d CreateObject("scripting.dictionary")獲取數據區域最后一行的行數lastrowA Sheets("對比對齊兩列數據").Cells(Rows.Coun…

linux啟動時掛載rootfs的幾種方式 .

轉載鏈接:http://blog.csdn.net/zuokong/article/details/9022707 根文件系統(在樣例錯誤消息中名為 rootfs)是 Linux 的最基本的組件。根文件系統包含支持完整的 Linux 系統所需的所有內容。它包含所有應用程序、配置、設備、數據等 Linux 中…

PHP 手冊

by:Mehdi AchourFriedhelm BetzAntony DovgalNuno LopesHannes MagnussonGeorg RichterDamien SeguyJakub Vrana其他貢獻者2018-06-19Edited By: Peter Cowburn中文翻譯人員:肖盛文洪建家穆少磊宋琪黃嘯宇王遠之肖理達喬楚戴劼褚兆瑋周夢康袁玉強段小強© 1997-…

前端使用puppeteer 爬蟲生成《React.js 小書》PDF并合并

前端也可以爬蟲,寫于2018年08月29日,現在發布到微信公眾號申明原創。掘金若川 本文章鏈接:https://juejin.im/post/5b86732451882542af1c80821、 puppeteer 是什么?puppeteer: Google 官方出品的 headless Chrome node 庫puppetee…

蜘蛛與佛的故事

最近閉關,空面四壁,窗外層巒疊嶂,窗臺上只有一盆花每日陪著我,朋友們都說我要成佛了,想想也是! 于是在閉關即將結束的時候找了一篇佛的故事送給自己,希望自己能夠頓悟一些"禪"機。 從前,有一座圓音寺,每天都…

信息安全管理與評估_計算機工程學院教師參加“信息安全管理與評估賽項”說明會...

看了就要關注我,喵嗚~2019年3月15日下午,2019年陜西省高等職業院校技能大賽“信息安全管理與評估賽項說明會”在咸陽職業技術學院舉行。出席本次會儀的有咸陽職業技術學院教務處長楊新宇、神州數碼范永強經理、神州數碼信息安全工程師高峰和各院校指導教…

haproxy概念和負載均衡

https://pan.baidu.com/s/1Sq2aJ35zrW2Xn7Th9j7oOA //軟件百度網盤連接 在80.100虛擬機上 systemctl stop firewalld //關閉防火墻 setenforce 0 //關閉監控 yum install lrz* -y //安裝上傳軟件 tar xf haproxy-1.5.15.tar.gz -C /opt/ //解壓壓縮包到/opt/ cd /op…

PHP用戶注冊郵箱驗證激活帳號

轉載鏈接:http://www.helloweba.com/view-blog-228.html 本文將結合實例,講解如何使用PHPMysql完成注冊帳號、發送激活郵件、驗證激活帳號、處理URL鏈接過期的功能。 業務流程 1、用戶提交注冊信息。 2、寫入數據庫,此時帳號狀態未激活。 …

知乎問答:一年內的前端看不懂前端框架源碼怎么辦?

知乎問答:一年內的前端看不懂前端框架源碼怎么辦?以下是我的回答,閱讀量 1000。現在轉載到微信公眾號中。鏈接:https://www.zhihu.com/question/350289336/answer/910970733其他回答的已經很好了。剛好最近在寫學習源碼整體架構系…

幫自己發個求職簡歷

幫自己發個求職簡歷 發個求職信息。本人擅長Web開發,尤其擅長Flex,愿從事Web開發,最好是Web前端開發,下面是我的詳細個人簡歷: 個人信息: 姓名:伍國耀 年齡:23 性別:男 專…

python函數 global_**Python的函數參數傳遞 和 global

函數的參數到底是傳遞的一份復制的值,還是對內存的引用?我們看下面一段代碼:a []def fun(x):x.append(1)fun(a)print(a)想想一下:如果傳遞的是一份復制的值,那么列表a應該是不會變化的,還是空列表&#xf…

冷啟動問題:如何構建你的機器學習組合?

作為即將告別大學的機器學習畢業狗的你,會不會有種迷茫的感覺?你知道 HR 最看重的是什么嗎?在求職季到來之前,畢業狗要怎么做,才能受到 HR 的青睞、拿到心儀的 Offer 呢?負責幫助應屆生找到機器學習工作的 …