天天看點

《Android應用開發與系統改造實戰》——1.5節Android NDK開發環境搭建

本節書摘來自異步社群《android應用開發與系統改造實戰》一書中的第1章,第1.5節android ndk開發環境搭建,作者 王保衛 , 申波,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

1.5 android ndk開發環境搭建

android應用開發與系統改造實戰

1.5.1 android ndk簡介

android ndk是編譯嵌入在android應用中的原生代碼(c或c++)的工具。

android應用運作在dalvik虛拟機上。ndk允許開發者用原生代碼(c或c++)實作應用的一部分。這将給某些應用帶來好處,這種方式可重用代碼,而且在某些情況下可加快運作速度。

ndk提供了将c和c++源代碼生成原生代碼庫的工具和檔案;提供了将原生庫嵌入apk檔案的方法;提供了相容android1.5版本以上的原生系統頭檔案和庫;提供了文檔,示例和指引。

最新釋出的ndk版本支援armv5te和armv7-a機器指令集,提供穩定的c庫頭檔案(c library),jni接口和其他的庫。在将來的版本中還将支援x86 instructions。

armv5te機器指令可以運作在所有的包含arm cpu的計算機上。armv7-a機器指令隻能運作在verizon droid 或者google nexus one這種具有相容性的cpu的機器上。這兩種機器指令的不同之處在于,armv7-a支援硬體fpu、thumb-2和neon指令。你可以以其中一個或者兩個為目标來設定,預設情況下是armv5te,你可以通過在應用程式的application.mk檔案的開始(通過設定預設指令的類型就很容易地切換到armv7-a)其他的部分都不用改變。你也可以建立同時适配兩種結構,并且将所有的東西都存儲在最終的.apk檔案中。

ndk并不适用于大部分應用。作為開發者,你應該衡量它的優缺點。很明顯,用原生代碼并不能自動提升性能,卻增加了應用的複雜度。ndk适合用于獨立的、占用記憶體少、占用較多cpu資源的處理,例如,信号處理、實體仿真等。簡單的用c重寫代碼一般不會帶來性能的大幅提升。不過,ndk提供了重用現有c/c++的有效途徑。

android framework層提供了兩種方法來通路本地native代碼。

(1)利用android framework來編寫應用,并且使用jni來通路android ndk提供的api。這項技術允許你充分利用framework層提供的便利,而且允許你在必要的時候編寫native代碼。不過編寫出來的應用隻可以運作在android 1.5以上的裝置上。

(2)編寫一個native的activity,這個activity允許你在native代碼中實作activity生命周期中的某個部分的回調。android sdk提供了nativeactivity類,它可以很友善地提示你,在activity的生命周期的某個部分,如oncreate( )、onresume( )或者onstop等時候再在native代碼中實作你的回調。利用native activity編寫的應用程式必須運作在android 2.3以及以後的系統版本平台上才可以。

注意 ndk并不能讓你開發純原生應用。android的主要運作時仍然是dalvik虛拟機。

ndk包含了一套交叉編譯工具(編譯,linkers等),它可生成linux、os x和windows(用cygwin)上的原生arm的二進制碼。

它提供了一套原生api的系統頭檔案(相容今後版本)。

ndk也提供了編譯系統,可以快速編譯源代碼,而不用處toolchain/platform/cpu/abi的細節問題。隻需建立很短的編譯檔案,用來說明哪些源代碼需要編譯,以及編譯到哪個目标android應用,編譯工具将根據此檔案編譯,并将生成的共享庫放到對應的應用下。

重要 提示 除上述的庫之外,android 1.5的原生系統庫在以後的版本有可能改變。是以,你的應用應該隻适用ndk提供的庫。

1.5.2 開發環境配置

1.配置指令行的編譯方式

(1)cygwin安裝。

首先下載下傳cygwin軟體,下載下傳位址如下:

cygwin安裝比較麻煩些,安裝的快慢主要依靠網絡速度。

我這裡選擇的是default安裝後,再安裝以下子產品。

make。

binutils。

gcc-core。

gcc4-core。

gdb。

gnu awk。

在搜尋輸入框裡分别輸入上面的關鍵字查找出來安裝,如圖1.43所示。

《Android應用開發與系統改造實戰》——1.5節Android NDK開發環境搭建

(2)ndk安裝。

從官方網站上下載下傳ndk後解壓到一個目錄下就可以了,解壓後的絕對路徑是e:/paul/developandroid/androidndkdevelop/android-ndk-r5。

(3)上面的軟體安裝完成後,下面設定環境變量。

進入c:cygwinhomeadministrator目錄,打開目錄裡的.bash_profile檔案,在最下面一行輸入設定ndk的編譯工具的目錄如下:

export dk_home=/cygdrive/e/paul/developandroid/androidndkdevelop/android-ndk-r5

(4)使用該工具的指令行進行編譯ndk自帶的程式。

打開已經安裝好的cygwin.exe檔案,如圖1.44所示。

《Android應用開發與系統改造實戰》——1.5節Android NDK開發環境搭建

然後開始編譯該目錄下的檔案。

輸入指令:$ndk_home/ndk-build,回車後開始編譯,編譯完成後,會在libs目錄下找到編譯完成的.so檔案,如圖1.47所示。

《Android應用開發與系統改造實戰》——1.5節Android NDK開發環境搭建
《Android應用開發與系統改造實戰》——1.5節Android NDK開發環境搭建
《Android應用開發與系統改造實戰》——1.5節Android NDK開發環境搭建

安裝完成後重新開機eclipse就可以了。

其實運作一個ndk的例子工程後發現,cdt并不是必須的,不過至少安裝cdt後并沒有什麼壞處。在利用ndk時,其中的c或c++檔案就可以利用android中的cdt工具進行開發。

安裝cdt之前c++檔案的編輯如圖1.51所示。

《Android應用開發與系統改造實戰》——1.5節Android NDK開發環境搭建

1.5.3 ndk的執行個體開發

1.建立工程

運作eclipse,建立一個android project,取名hellojni(或者自己喜歡的其他名字,比如fxxk-jni也行)。

工程代碼就從ndk/samples/hello-jni複制一份即可,記得複制jni那個目錄,最終的配置目錄結構如圖1.53所示。

《Android應用開發與系統改造實戰》——1.5節Android NDK開發環境搭建

libs目錄會自動建立,如圖1.53所示。

下面是各部分的代碼,其中,hellojni.java的代碼如下:

因為還沒有産生那個libhello-jni.so出來。沒關系,下面繼續進行可以解決問題。

2.工程屬性設定

打開hello-jni工程屬性,選擇builders,點選new,選擇program,點選“ok”按鈕,如圖1.54所示。

配置如下,名字随便取一個,location和working directory要和你的cygwin目錄一緻,arguments要和工程目錄一緻。arguments是:

其中指令第一部分e/paul/developandroid/workspace21/anroidndktest是你的工程所在的目錄,第二部分$ndk_home/ndk-build是在cygwin下設定的環境變量,這是在使用ndk工具,如圖1.55所示。

《Android應用開發與系統改造實戰》——1.5節Android NDK開發環境搭建

從上面的圖檔應該看得清,然後勾選其他配置如圖1.56和圖1.57所示。

《Android應用開發與系統改造實戰》——1.5節Android NDK開發環境搭建

當以上步驟都正确配置無誤,儲存配置後應該就會自動編譯jni目錄下的c相關代碼,并輸出相應的.so庫檔案到工程的libs目錄下,libs目錄會自動建立。

注意如圖1.58所示,将ndk_builder向上移動到第一位,因為c++需要先編譯成.so後java程式才能使用。

《Android應用開發與系統改造實戰》——1.5節Android NDK開發環境搭建

編譯時控制台輸出類似如圖1.59所示。

《Android應用開發與系統改造實戰》——1.5節Android NDK開發環境搭建

至此,我們的ndk環境搭配完畢,并且在此時,或許你對ndk有了初步的了解,能夠掌握這些就可以進行ndk的開發了,用到ndk的時候一般是具有獨立功能的部分,如播放器的編解碼部分,可以将這部分用c++開發并生成so檔案,再從java程式中調用就可以了。

上一篇: 正則
下一篇: 正則