Android NDK開發輕鬆入門

來源:互聯網
上載者:User

簡介:

 

AndroidNDK是能使Android應用開發人員把從c/c++編譯而來的本地代碼嵌入到應用程式套件中的一系列工具的組合。

 


注意:

AndroidNDK只能用於Android1.5及以上版本中。

 


I. Android NDK 目標:
Android虛擬機器允許你的應用在源碼中通過JNI調用本地代碼中實現的方法們。概括起來,這表示:

-你的應用的源中要聲明一個或多個方法,這些方法前面需有'native'關鍵字,這表明它們被本地代碼實現。如:

nativebyte[] loadFile(String filePath);

-你必須提供本地的共用庫,庫中包含這些方法的實現。這個庫將會打包你的應用.apk中。這個庫的命名必須符合標準的Unix命名規則,也就是:lib<something>.so這種形式。並且還要包含一個標準的JNI入口。例如:

libFileLoader.so

-你的應用必須顯式的載入本地庫。例如,要在應用啟動時載入,只需簡單地在代碼中增加如下語句:

static{

System.loadLibrary("FileLoader");

}

注意寫庫的名字時你不需要使用'lib'首碼和'.so'尾碼。

AndroidNDK只是AndroidSDK的一個組件,它協助你:

-產生JNI相容的共用庫,此庫能運行於跑在ARMCPU上的Android1.5及以上系統。

-把共用庫考貝到你的應用的項目中的合適的位置,並最終把它們添加到你的.apks中。

-在後續的NDK版本中,我們打算提供通過遠程gdb調試本地代碼的工具並盡量多地提供源碼和符號資訊。

 


AndroidNDK還提供了:

-一系列跨平台的編譯工具(編譯器,連結器,等等),它們可以在Linux,OS X 和 Windows (使用Cygwin)上產生ARM上的二進位程式碼。

-一系列的標頭檔,對應於Android系統所支援的穩定的本地API們,這保證了你所用的介面在後續所有版本中依舊被支援。

 


重點注意:

記住大多數系統庫並沒有固定死並且可能在未來的版本中會發生重大變化,甚至被刪除,但是”穩定的API們”是不變的。

 


-一個構建系統,使得開發人員只需寫少量編譯檔案描述哪些源檔案需被構建即可。構建系統可處理所有編譯工具鏈/平台/CPU/ABI細節。還有,後續的NDK更新中可以在添加更多的編譯工具鏈,平台,系統介面的同時不需開發人員的項目構建檔案發生變化。

 


II.Android NDK 不想做的:
使用NDK編寫運行於android裝置上的一般本地代碼這種方式並不好。你的應用依然應該使用Java編寫,正確處理Android系統的事件來避免"應用無反應"對話方塊的出現或處理應用的生命週期。

 


注意,無論如何還是可以通過本地代碼編寫精巧的應用的,這個應用上只是帶有一個很小的用於啟動/關閉應用的封裝。

 


對JNI的深刻理解是非常必要的。因為在這個環境中的很多操作需要開發人員做出一些特殊的處理,而它們在典型的一般代碼(java)中是不需要的。這些包括:

-不能通過指標直接使用VM對象的內容。例如,你無法安全地擷取一個指向java字串對象的16位字元數組的指標然後在一個迴圈中枚舉它的每一項。

-當本地代碼想要在不同的JNI調用之間儲存VM對象的控制代碼時,需要對控制代碼進行明確的引用管理。

 


NDK僅僅為被android系統支援的本地API和庫中很少的一些提供了標頭檔。然而一個典型的Android系統映像包含了很多本地共用庫,但這些應被看做是實現的細節,這些實現可能在平台更新或發布時產生徹底的變化。

如果一個Android系統的庫沒有被NDK的標頭檔明確支援,那麼應用不應依賴於它。否則可能在下一次系統升級後出現杯具。

選中的系統庫將逐漸地被添加到穩定版的NDKAPI中。

 


III.NDK 開發實踐:
下面是一個對使用NDK開發本地代碼過程的粗略的概覽:

1/將你的本地代碼源碼放在路徑 $PROJECT/jni/下。

2/寫一個檔案:$PROJECT/jni/Android.mk,來描述你的源檔案們。

3/可選的:在檔案$PROJECT/jni/Application.mk中描述你的項目的更多細節。儘管你不需要從頭寫,但你可以處理多CPU問題以及改寫編譯/連結選項。(更多細節請觀docs/APPLICATION-MK.html )。

4/在你的項目路徑下或其任何子路徑下運行"$NDK/ndk-build"來編譯你的本地代碼。

 


最後一步將在編譯成功時複製你的應用所需共用庫到你項目的跟路徑下。然後你可以用跟以前一樣的方式產生最終的.apk檔案。

 


下面,是一些更多的細節:

 


III.1/配置NDK:
以前的發行版需要你運行'build/host-setup.sh'指令碼來配置你的NDK。但是這一步從第4版(NDK r4)開始被移除了。

 


III.2/放置 C 和 C++源碼:
將你的本地源碼放在以下路徑下:

$PROJECT/jni/

$PROJECT對應你的android應用項目的路徑。

你可以隨意組織jni下的內容,路徑名和路徑結構不會影響到最終產生的應用程式套件。所以你無需使用類似於com.<mycompany>.<myproject>這樣的名字。

注意 C和C++源碼都是被支援的。預設C++副檔名是'.cpp',但是其它的副檔名也可以被處理。(見文檔docs/ANDROID-MK.html).

也可以通過調整檔案Android.mk的內容,把你的源碼存放在其它路徑下。

 


III.3/寫一個Android.mk 構建指令碼:
一個 Android.mk檔案是一個很小的構建指令碼。你編寫它以描述你給NDK構建器的源碼檔案們。它的文法在docs/ANDROID-MK.html中有詳細描述。

 


NDK簡單的將你的原檔案組織到多個"模組"中,每個模組可以是以下的任意一種:

-一個靜態庫

-一個共用庫

 


你可以在一個Android.mk中定義多個模組或寫多個Android.mk檔案,每個檔案只對應一個模組。

注意,一個Android.mk檔案可能被構建系統分析多遍,所以不要假設某個變數沒有被定義。預設下,NDK將尋找下面的構建指令碼:

$PROJECT/jni/Android.mk

如果你想在子路徑下定義Android.mk檔案,你應該在頂層的Android.mk中包含它們。有個函數可以做到這個功能:

include$(call all-subdir-makefiles)

這將會包含當前構建路徑的所有子路徑下的Android.mk檔案們。

 


III.4/寫一個Application.mk構建檔案(可選):


Android.mk描述你要構建的模組們,而Application.mk檔案描述你的應用自身。看文檔docs/APPLICATION-MK.html來瞭解這個檔案允許你做什麼。這個檔案主要包含:

-你的應用所需要模組的準確列表。

-產生的機器碼所對應的CPU架構。

-可選的資訊,像你要構建release還是 debug,特殊的C 或 C++編譯參數以及其它需要應用到所有模組的構建選項。

 


這個檔案是可選的:預設情況下,NDK將構建在Android.mk中列出的所有模組的並且預設面向CPUABI (armeabi).

有兩種方法使用一個Application.mk:

-將它放在$PROJECT/jni/Application.mk位置,那麼它會被'ndk-build'指令碼自動使用。

-將它放在$NDK/apps/<name>/Application.mk,$NDK代表你的NDK安裝路徑。之後,在NDK路徑下運行"make APP=<name>"。

這是在NDKr4 之前的辦法。出於相容的原因,當前還是被支援的,但是我們強烈鼓勵你使用第一種方法。因為它簡單並且不用改動NDK安裝路徑下的路徑樹結構。

 


III.5/調用NDK構建系統:


使用NDK構建機器代碼的最佳方式是使用'ndk-build'指令碼。你也可以使用另一個老的方式--依賴於建立'$NDK/apps'子目錄的方式。

不論哪種方式,編譯成功後,那些編譯出的“裸體”(不帶有調試資訊的)二進位模組都將被複製到你應用項目所在的路徑下(注意非“裸體”的二進位模組會保留以提供調試能力。沒有必要把非“裸體”模組複製到裝置上去)。

 


1:使用'ndk-build'命令:

 


'ndk-build'指令碼可以在NDK安裝所在的頂級目錄下找到,可以直接你的應用項目的目錄(也就是你的AndroidManifest.xml所在的目錄)或任何子目錄下調用。

例如:

cd$PROJECT

$NDK/ndk-build

 


這將啟動NDK構建指令碼,指令碼將自動探測你的開發系統和應用專案檔來決定構建什麼東西。

例如:

ndk-build

ndk-build clean --> 清空所編譯出的二進位檔案們。

ndk-build -B V=1 --> 強制完全重新編譯,並顯示命令

 


預設下,指令碼希望看到一個可選的$PROJECT/jni/Application.mk和一個必須的$PROJECT/jni/Android.mk。

成功後,會把產生的二進位模組(即共用庫)複製到你的項目樹中的合適位置。你可以在之後使用’ant’命令或ADP外掛程式來重建完整的應用程式套件。

關於這個指令碼的更完整的說明和可用的選項,見docs/NDK-BUILD.html。

 


2:使用$NDK/apps/<name>/Application.mk:

 


這種構建方式是NDKr4以及正前版本的唯一選擇,當前還支援,僅僅是為了相容的原因。我們強烈建議你麻溜地移植為使用'ndk-build'命令的方式,因為我們可能很快就把這種方式拋棄掉。

用它需要這樣做:

1.在你的NDK安裝目錄下(不是你的應用路徑)建立一個子目錄,叫:$NDK/apps/<name>/ 。<name>是一個任意的名字用來向NDK構建系統描述你的應用(不能有空格)。

2.寫一個 $4NDK/apps/<name>/Application.mk,需在裡面定義一個APP_PROJECT_PATH指向你的應用項目目錄。

3.在命令列中,進入到NDK安裝路徑,然後調用頂層的GNUMakefile,如下:

cd$NDK

makeAPP=<name>

結果同第一種方法一樣,除了一些中間產物放在$NDK/out/apps/<name>/下之外。

 


IV.重建你的應用程式套件:

使用NDK產生二進位檔案後,你需是用通常的方式重建的你應用程式套件檔案(.apk),即使用'ant'命令或ADTEclipse 外掛程式。

你的新.apk中將被嵌入共用庫檔案,然後在安裝到裝置時被系統自動分離出來。

 


V.對調試的支援:

NDK提供了一個輔助指令碼,叫做'ndk-gdb',來十分輕鬆地為你的應用啟動一個偵錯工作階段。

 


本地調試只能在運行Android2.2 或更高系統的裝置上執行。並且不需要特殊使用者權限。

更多資訊,請對docs/NDK-GDB.html。簡要來說,本地調試分以下幾步:

1.確定你的應用是可調試的 (在AndroidManifest.xml中設定android:debuggable為"true")。

2.使用'ndk-build'構建你的共用庫,然後構建你的應用然後安裝到裝置或模擬器上。

3.運行你的應用。

4.在你的應用項目目錄下運行 'ndk-gdb'。

 


你將看到gdb提示符出現。然後扒著GDB手冊笨笨的調吧。

 

摘自 nkmnkm的專欄

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.