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

本篇文章將介紹如何使用 CMake 構建實現你的第一個 NDK 項目。html

前言

你好!歡迎來到個人的學習筆記分享系列,第一次給你們分享的是 Android NDK 開發的學習筆記,讓咱們先開始瞭解 NDK 的構建方式吧! NDK 構建方式有兩種,一種是 ndk-build,另外一種是 CMake,從 Android Studio 2.2 開始,Android Sudio 默認地使用 CMake 做爲 NDK 項目的構建工具,本文將先介紹如何使用 CMake 來構建你的第一個 NDK 項目。java

關於NDK

什麼是NDK

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

爲何要使用NDK

NDK 對許多類型的 Android 應用沒什麼價值。 由於它不可避免地會增長開發過程的複雜性,但在一些狀況下卻可能頗有用或者是必須的,下面列舉一些 NDK 的使用目的:git

  • 從設備獲取更好的性能以用於計算密集型應用,例如遊戲或物理模擬
  • 重複使用本身或其餘開發者的 C/C++ 庫,便利於跨平臺。
  • NDK 集成了譬如 OpenSLVulkan 等 API 規範的特定實現,以實如今 java 層沒法作到的功能如提高音頻性能等
  • 增長反編譯難度

NDK 下載

能夠直接經過 Android Studio >> SDK Manager >> SDK Tools 來下載最新的 NDK 包 github

NDK 下載
下載後所在目錄是 $(你的sdk目錄)/ndk-bundle,裏面有不少重要的工具如 ndk-buildndk-gdb 等,以後會再作介紹。固然,你也能夠:

關於 CMake

什麼是 CMake

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

CMake 下載

和在 Android Studio 中下載 NDK 同樣,能夠直接經過 Android Studio >> SDK Manager >> SDK Tools 來下載 CMake: bash

CMake 下載
固然,你也能夠:

使用 CMake 構建 NDK 項目

建立 NDK 項目

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

建立新項目
而後一直往下,在自定義 C++ Support 界面保持 Toolchain Default 便可

自定義 C++ Support
項目建立了以後,你會在 Project 目錄視圖下,發現比普通的建立新項目多了幾個文件: cpp目錄裏是默認生成的 cpp 文件, CMakeLists.txt 爲 CMake 構建腳本。

Project 層級視圖

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

app/build.gradle
這就是前文提到的在 Gradle 使用 CMake 配置爲外部構建, .externalNativeBuild 文件所以生成,其中 path 指定了構建腳本的路徑。還能夠補充其餘參數信息,可查閱:

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})
複製代碼

固然,你也能夠查看:

編譯

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

apk

本文爲我的原創,轉載請註明出處。

相關文章
相關標籤/搜索