Android高級開發工程師-NDK開發

1、編譯原理

將高級語言轉換爲二進制機器碼android

編譯流程

  1. 預處理
  • 完成宏替換、文件引入,以及去除空行、註釋等,爲下一步的編譯作準備。
  • 對各類預處理命令進行處理,包括投文件的包含、宏定義的擴張、條件編譯的選擇等。
  1. 編譯
  • 將預處理後的代碼編譯成彙編代碼。在這個階段,首先要檢查代碼的規範性、是否有語法錯誤等,以肯定代碼實際要作的工做,在檢查無誤後,再把代碼翻譯成彙編語言。
  • 編譯程序執行時,先分析,後綜合。分析,就是指詞法分析、語法分析、語義分析和中間代碼生成。綜合,就是指代碼優化和代碼生成。
  • 大多數的編譯程序直接產生機器語言的目標代碼,造成可執行的目標文件,也有的是先產生彙編語言一級的符號代碼文件,再用匯編程序進行翻譯和加工處理,最後產生可執行的機器語言文件。
  1. 彙編
  • 就是將彙編代碼文件轉成二進制代碼文件,即機器代碼文件(01序列)。
  1. 連接
  • 就是將多個目標文件及所需的庫文件連接生成可執行文件的過程。

2、動態庫和靜態庫

  1. 靜態庫
  • 就是一些目標文件(.o結尾)的集合,靜態庫通常以.a結尾,只用於生成可執行文件階段。
  • 在連接步驟中,連接器將從庫文件取得所需代碼,複製到生成的可執行文件中。
  • 特色是可執行文件中包含了庫代碼的一份完整拷貝,在編譯過程當中被載入程序中。缺點就是屢次使用會有多分冗餘拷貝,並且由於是在編譯階段進行的拷貝,若是靜態庫有更新,全部使用它的程序都須要從新編譯、發佈。
  • 靜態庫的編譯的可執行文件的依賴,靜態庫不須要被依賴。
  1. 動態庫
  • 通常以.so結尾。
  • 在連接階段沒有被複制到程序中,而是在程序運行時有系統動態加載到內存中供程序調用。
  • 系統只需載入一次動態庫,不一樣的程序能夠獲得內存中相同動態庫的副本。
  • 動態庫的編譯的可執行文件的依賴,動態庫是須要依賴的。
  1. 區別
  • 靜態庫,在程序編譯時會複製代碼到目標代碼中,程序運行時再也不須要靜態庫,所以體積較大。並且每次編譯都須要載入靜態代碼,所以內存開銷大。
  • 動態庫,在程序編譯時不會複製代碼到目標代碼中,而是在程序運行時才被載入,程序運行時須要動態庫存在,所以體積較小。並且系統只需載入一次動態庫,不一樣程序能夠獲得內存中相同的動態庫副本,所以內存開銷小。

3、Android.mk簡介

Android.mk是一個面向Android NDK構建系統描述NDK項目的GNU makefile片斷。主要用來編譯生成如下內容:編程

  • APK程序:通常的Android應用程序,系統級別的直接push便可。
  • JAVA庫:JAVA類庫,編譯打包生成JAR文件。
  • C/C++應用程序:可執行的C/C++應用程序。
  • C/C++靜態庫:編譯生成C/C++靜態庫,並打包成.a文件。
  • C/C++動態庫:編譯生成C/C++動態庫,並打包成.so文件。
#定義模塊當前路徑(必須定義在文件開頭,只需定義一次)
#利用該變量來定位源文件
# my-dir是編譯系統提供的宏函數,返回當前Android.mk的路徑
LOCAL_PATH := $(call my-dir)

#清空當前環境變量(LOCAL_PATH除外)
#CLEAR_VARS是編譯系統提供的變量,指向特定的GNU的makefile片斷,清除環境變量
#使用該語法緣由是,編譯系統在單次執行中會解析多個構建文件和模塊定義。而LOCAL開頭的變量是全局變量。因此每次都要先清除下環境變量,避免衝突
include $(CLEAR_VARS)

#當前模塊名(這裏會生成libhello-jni.so)
#必須惟一,不能包含空格
LOCAL_MODULE := hello-jni

#當前模塊包含的源代碼文件
#多個文件,空格分隔
LOCAL_SRC_FILES := hello-jni.c

#表示當前模塊被編譯成庫的類型。靜態庫、共享庫。
#當前爲共享庫
Include $(BUILD_SHARED_LIBRARY)
複製代碼

示例

預編譯模塊不須要編譯。該預編譯模塊會被拷貝到 PROJECT/obj/local 下面,還會被拷貝到PROJECT/libs/<abi> 下面(這裏的庫被strip過)。

4、CMake

CMakeLists.txt簡介

AndroidStudio3.4之後,建立C/C++Support的項目,會再src/main目錄生成cpp目錄,包含CMakeLists.txt。bash

改動或新增.cpp文件,要從新調用gradle同步,纔會編譯,不然.cpp文件提示錯誤。函數

示例

CMakeLists.txt配置 工具

使用第三方庫
gradle配置

介紹

#指定CMake最低支持的版本(可選)
#若是使用了高版本的命令,則須要指定最低的版本
cmake_minimum_required(VERSION 3.4.1)
複製代碼

NDK開發步驟

Android Native Developmeng Kit (NDK)是一系列的開發工具,運行程序開發人員在Android應用程序中嵌入C/C++編寫的代碼。你可使用它去構建本身的源碼或利用現有的庫。開發工具

  1. 經過AndroidStudio下載NDK
  2. 配置NDK環境變量
  • 如何驗證,使用ndk-build命令
  1. 編譯JNI的方式
  • android.mk
  • cmake(AndroidStudio2.2之後默認方式)
相關文章
相關標籤/搜索