1. 程式人生 > >android進階3step4:Android Studio——NDK配置

android進階3step4:Android Studio——NDK配置

課程目標

  • 1,瞭解NDK Android NDK
  • 2,完成環境搭建
  • 3,能夠開發完整NDK專案

課程內容

  • 1,初見Android NDK
  • 2,開發環境搭建
  • 3,Android NDK到底是什麼
  • 4,Android NDK使用規範

一、初見Android NDK

1,Android NDK簡介 

2,Android NDK優缺點及使用場景

3,本課程的優勢及所需的準備

 

1,Android NDK簡介 


Android NDK簡介NDK全稱是Native Development Kit

官方解釋:

NDK是一套允許開發人員將原生代碼嵌入Android應用程式包,可以將Android應用程式中的部分功能用C / C ++語言來實現,並將這部分C / C ++程式碼編譯成可直接執行在Android平臺上的原生代碼。這些原生代碼以及連結庫的形式存在,並能自動將so和java應用一起打包成apk。 

一句話解釋:NDK允許開發人員用C / C ++開發Android程式

與NDK密切相關的另一個詞彙則是JNI,它是NDK開發中的樞紐,Java與底層互動絕大多數都是通過它來完成的

那麼接下來看看什麼是JNI?


JNI:Java Native Interface

也就是java本地介面,它是一個協議,這個協議用來溝通java程式碼和原生代碼(c / c ++)。通過這個協議,Java類的某些方法可以使用原生實現,同時讓它們可以像普通的爪哇方法一樣被呼叫和使用,而原生方法也可以使用的Java物件,呼叫和使用的Java方法也就是說,使用JNI這種協議可以實現:用Java程式碼呼叫C / C + +程式碼,而C / C ++程式碼也可以呼叫的Java程式碼。

執行機制:


2,Android NDK優缺點及使用場景

優點:

  • 機本。程式碼執行效率高
  • 反編譯難度大保密性好
  • 可以直接接觸底層系統
  • 嵌入式原生代碼平臺個人文庫個人文庫
    移植性好
  • 方便使用各種開源庫

缺點:

  • 呼叫步驟繁瑣
  • 互調過程開銷較大
  • 需要處理資源分配與釋放
  • 瞭解的知識更多

使用場景如下:

  1. 編寫Android的驅動
  2. 對執行效率有高要求
  3. 對底層系統或一些本地開源庫有依賴
  4. 程式碼保密性高

3,課程的優勢及所需的準備

  1. 使用Android Studio做開發
  2.  從0開始編寫完整NDK專案
  3. 分別介紹Linux的的/蘋果機和視窗下開發方式
  4. 涉及部分底層原理及進階內容
  5.  Gradle 2.5 1
  6. 安裝並配置好Android Studio2.2以上開發環境
  7. 熟練使用C / C ++
  8. 有一定的的Linux的使用經驗

二,NDK的環境搭建(MAC版)

一.NDK下載:

根據你的電腦下載NDK下載地址

目錄介紹:

  • ndk-build:該shell指令碼是Android NDK構建系統的起始點(最重要的檔案
  • NDK-GDB:該外殼指令碼允許用GUN偵錯程式除錯原生元件
  • NDK堆疊:該外殼指令碼可以幫助分析原生元件崩潰時的堆疊追蹤
  • build:該目錄包含了Android NDK構建系統的所有模組
  • 平臺:該目錄包含了支援不同Android目標版本的標頭檔案和庫檔案,Android NDK構建系統會根據具體的Android版本自動引用這些文件
  • 來源:該目錄包含了可供開發人員匯入到現有的Android NDK專案的一些共享模組
  • samples:該目錄包含了一些示例應用程式,這些程式可以提現Android NDK的效能,示例程式對於學習如何使用Android NDK的特性很有幫助
  • toolchains:該目錄包含了目前Android NDK支援的不同架構的交叉編譯器,Android NDK目前支援ARM,X86,MIPS

二。環境變數配置

解壓NDK的zip包,注意路徑目錄不要出現空格和中文,這裡建議大家把包解壓到SDK目錄裡面,並命名為ndk-bundle,好處是,啟動AS的時候會檢查它並直接新增到ndk.dir中,減少我們的配置工作;(步驟三:android studio中配置會說)

1.開啟終端,輸入命令:進入下載好的NDK資料夾中

cd ~/Library/Android/sdk/nkd-bundle

2.配置環境變數(進入當前目錄的.bash_profile中配置檔案中)然後英文狀態下點選i(插入)鍵(才可以插入)

vi ~/.bash_profile

3.新增配置指定NDK,建立執行檔案的目錄

export PATH=${PATH}:~/Library/android/sdk/ndk-bundle/build

輸入完之後點選ESC退出,下方輸入:WQ然後按輸入鍵儲存

4.使剛剛配置檔案生效並啟動終端 

 source ~/.bash_profile
 exit

5.重啟終端後輸入 

ndk-build

就會顯示(就成功啦)

Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.    
/Users/mac/documents/android-ndk-r16b/build/core/build-local.mk:151: *** Android NDK: Aborting    .  Stop.

如果途中遇到:Mac終端命令列報錯-bash:vi:command not found  說明你環境變數設定有誤,參考這篇文章

注意路徑是否寫錯之類

三,Android Studio中的配置

1.開啟android studio檔案 - >專案結構 

Android NDK位置寫入路徑

工程中的local.properties檔案中自動生成目錄啦(方便之處,不用手動新增)

省去上面的三個方法,最簡單的是在android studio中的

首選項 - >外觀$行為 - >系統設定 - > Android SDK中進行相應的NDK下載

四,genymotion虛擬機器的配置

genymotion執行的速度比作為自帶的虛擬機器快得多,因為NDK需要臂平臺的機子執行,在作為上自帶的臂執行更慢了

所以下載genymotion虛擬機器提高開發效率,使用真機也可以

genymotion下載配置參考這篇文章:mac上安裝Genymotion

安裝完之後,要裝Genymotion-ARM-Translation  密碼:r93e genymotion的ARM平臺包

直接將zip包拖動開啟的虛擬機器就可以自動安裝了。

安裝完成會讓你重啟虛擬機器。

三、Android NDK使用規範(做一下了解)

  1. Android NDK目錄結構及配置檔案解析
  2. Android NDK中資料型別對應關係
  3. Java呼叫Native函式的方法
  4. Jni 字串處理

1、Android NDK目錄結構及配置檔案解析


 

目錄結構 

  • Java 目錄:Android Java程式碼
  • Jni 目錄:
  1.  C程式碼
  2.  H標頭檔案
  3.  MK配置檔案
  • Libs目錄:通過ndk編譯出來的so連結庫
  • Obj目錄:C程式碼編譯出的目標檔案(中間產物)

Android.mk 配置檔案

要在兩個include之間進行配置 

LOCAL_PATH:jni所在目錄

CLEAR_VARS:清空本地配置變數,必須執行

LOCAL_MODULE:該變數指定模組名字( 指定生成.so的檔名,系統自動加上lib+指定的名字.so)

LOCAL_SRC_FILES:C/C++原始檔名

BUILD_SHARED_LIBRARY:指定一個建立共享庫的GNU Make指令碼檔案



2、Android NDK中資料型別對應關係

Java呼叫Native函式的方法

1、靜態註冊(懶漢式 -時間換空間)

方法名是“包名_類名_方法名”,形式複雜

上面的例子是在test.c函式中的形式是: 相當於在把.換成了下劃線_

java_imooc_android_com_myndktest_NdkUtil_stringFromJNI

string_1FromJNI

這表示是一個整體(等價):stringFromJNI 通過這個方法消除歧義

2、動態註冊 (餓漢式 -空間換時間)

通過陣列完成對應關係註冊,靈活 

在main目錄下建立jni目錄建立.c檔案進行動態註冊 

Jni 字串相關處理

  1. NewStringUTF:建立一個UTF編碼的字串
  2. GetStringUTFChars:訪問一個字串
  3. GetStringUTFLength:查詢字串的長度
  4. ReleaseStringUTFChars:釋放字串所佔記憶體,與Get成對 

Android ndk程式編寫步驟

  1. 在Gradle中配置ndk so庫名稱
  2. 編寫JAVA程式碼,用Native關鍵字宣告C函式
  3. 編寫C語言程式碼,通過靜態/動態註冊繫結函式
  4. 注意Jni變數型別對應關係

Android NDK 進階

  1. 學習JNI函式的對映機制
  2. 編寫Android驅動及HAL層程式碼
  3. 將複雜演算法通過NDK提升效率
  4. 編寫跨平臺連結庫