2023年全國(guó)碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩36頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第10章 Android NDK開發(fā),,,,本章學(xué)習(xí)目標(biāo):,了解Android NDK的用途掌握Android NDK編譯環(huán)境的安裝與配置方法掌握Android NDK的開發(fā)方法,10.1 NDK簡(jiǎn)介,Android NDK(Android Native Development Kit)是一系列的開發(fā)工具,允許程序開發(fā)人員在Android應(yīng)用程序中嵌入C/C++語言編寫的非托管代碼Android NDK優(yōu)勢(shì)解決了核心模塊

2、使用托管語言開發(fā)執(zhí)行效率低下的問題允許程序開發(fā)人員直接使用C/C++源代碼,極大的提高了Android應(yīng)用程序開發(fā)的靈活性Android NDK不足增加程序的例如信號(hào)處理或物理仿真)使用非托管代碼運(yùn)行效率最高,復(fù)雜性,增加了程序調(diào)試的難度CPU運(yùn)算量大和內(nèi)存消耗較少的部分(因此并不是所有的核心部分都適合使用C/C++語言編寫,10.1 NDK簡(jiǎn)介,Android NDKAndroid NDK的版本是1.5,集成了交叉編譯器,支

3、持ARMv5TE處理器指令集、JNI接口和一些穩(wěn)定的庫文件Android NDK僅支持Android SDK 1.5版本,因此1.0和1.1版本的應(yīng)用程序不能夠使用Android NDKAndroid NDK提供一系列的說明文檔、示例代碼和開發(fā)工具,指導(dǎo)程序開發(fā)人員使用C/C++語言進(jìn)行庫文件開發(fā),并提供便捷工具將庫文件打包到apk文件中,10.2 NDK編譯環(huán)境,Android NDK編譯環(huán)境支持Windows XP、Linux和

4、MacOS,本書僅介紹Windows系統(tǒng)的編譯環(huán)境配置方法Windows系統(tǒng)的編譯環(huán)境配置方法下載Android NDK的安裝包下載并安裝Cygwin配置Cygwin的NDK開發(fā)環(huán)境測(cè)試開發(fā)環(huán)境是否可以正常工作,10.2 NDK編譯環(huán)境,下載Android NDK的安裝包在Google的官方網(wǎng)站下載Android NDK的安裝包,下載地址是http://developer.android.com/sdk/ndk/1.5_r1

5、/index.html,打開下載頁面后選擇的下載文件為android-ndk-1.5_r1-windows.zip,10.2 NDK編譯環(huán)境,下載Android NDK的安裝包將下載的ZIP文件解壓縮到用戶的Android開發(fā)目錄中,作者將Android NDK解壓到E:\Android目錄中,ZIP文件中包含一層目錄,因此Android NDK的最終路徑為E:\Android\android-ndk-1.5_r1,10.2 NDK編

6、譯環(huán)境,下載并安裝CygwinAndroid NDK目前還不支持在Windows系統(tǒng)下直接進(jìn)行交叉編譯,因此需要在Windows系統(tǒng)下安裝一個(gè)Linux的模擬器環(huán)境Cygwin,完成C/C++代碼的交叉編譯工作Android NDK要求GNU Make的版本高于或等于3.18,之前的版本并沒有經(jīng)過測(cè)試,因此需要安裝較新版本的CygwinCygwin的最新版本可以到官方網(wǎng)站http://www.cygwin.com下載,也可以到中文

7、的映像網(wǎng)站http://www.cygwin.cn下載,10.2 NDK編譯環(huán)境,下載并安裝Cygwin在Cygwin的安裝過程中,需要將Devel下的gcc和make的相關(guān)選項(xiàng)選上,否則Cygwin將無法編譯C/C++代碼文件,10.2 NDK編譯環(huán)境,配置Cygwin的NDK開發(fā)環(huán)境在缺省情況下,Cygwin安裝在C盤的根目錄下,修改C:\cygwin\home\username\.bash_profile文件,username

8、會(huì)根據(jù)用戶使用的用戶名稱而變化在.bash_profile文件的結(jié)尾處添加如下代碼上面的代碼說明了Android NDK所在的目錄,目錄是e盤android/android-ndk-1.5_r1如果Android NDK安裝在c盤的TestAndroid/android-ndk-1.5_r1中,則上面的代碼則應(yīng)該為,10.2 NDK編譯環(huán)境,測(cè)試開發(fā)環(huán)境是否可以正常工作首先啟動(dòng)Cygwin,然后切換到/build目錄中,運(yùn)行

9、host-setup.sh文件如果運(yùn)行結(jié)果如下圖,說明Android NDK的開發(fā)環(huán)境已經(jīng)可以正常工作了Android NDK的編譯環(huán)境已經(jīng)安裝配置完畢,10.2 NDK編譯環(huán)境,Android NDK的目錄結(jié)構(gòu)在android-ndk-1.5_r1目錄中,包含5個(gè)子目錄和2個(gè)文件apps目錄是Android工程的保存目錄,子目錄hello-jni和tow-libs是NDK自帶的兩個(gè)示例目錄build目錄保存了交叉

10、編譯工具、編譯腳本和配置文件docs目錄是幫助文檔的保存目錄out目錄是交叉編譯的輸出目錄,保存輸出的so文件,10.2 NDK編譯環(huán)境,Android NDK的目錄結(jié)構(gòu)sources目錄是C/C++源代碼文件的保存目錄,其下的hello-jni和tow-libs子目錄,分別保存了NDK自帶示例所需要的C/C++源代碼文件GNUmakfile文件和README.TXT文件分別是make工具的配置文件和NDK的說明文件,10.2

11、NDK編譯環(huán)境,Android NDK的目錄結(jié)構(gòu)docs目錄中的幫助文件說明,10.2 NDK編譯環(huán)境,Android NDK自帶兩個(gè)示例hello-jni和tow-libshello-jni是一個(gè)非常簡(jiǎn)單的例子,非托管代碼實(shí)現(xiàn)了一個(gè)可以返回字符串的共享庫,Android工程調(diào)用這個(gè)共享庫獲取字符串,然后顯示在用戶界面上tow-libs是稍微復(fù)雜一些的例子,使用非托管代碼實(shí)現(xiàn)了一個(gè)數(shù)學(xué)運(yùn)算的共享庫,Android工程動(dòng)態(tài)加載這個(gè)共

12、享庫,并調(diào)用其中的函數(shù),函數(shù)功能是通過使用靜態(tài)庫實(shí)現(xiàn)的,10.3 NDK開發(fā)示例,在進(jìn)行NDK開發(fā)時(shí),一般需要同時(shí)建立Android工程和C/C++工程,然后使用NDK編譯C/C++工程,形成可以被調(diào)用的共享庫,最后共享庫文件會(huì)被拷貝到Android工程中,并被直接打包到apk文件中后面的內(nèi)容將AndroidNdkDemo示例說明如何進(jìn)行Android NDK開發(fā)AndroidNdkDemo是一個(gè)進(jìn)行加法運(yùn)算的示例,程序會(huì)隨機(jī)產(chǎn)生兩

13、個(gè)整數(shù),然后調(diào)用C語言開發(fā)的共享庫對(duì)這兩個(gè)整數(shù)進(jìn)行加法運(yùn)算,最后將運(yùn)算結(jié)果顯示在用戶界面上,10.3 NDK開發(fā)示例,AndroidNdkDemo示例的界面進(jìn)行Android NDK開發(fā)一般要經(jīng)過如下的步驟建立Application.mk文件建立Android工程建立Android.mk文件建立C源代碼文件編譯共享庫模塊,10.3 NDK開發(fā)示例,建立Application.mk文件建立步驟在apps目錄中建立應(yīng)

14、用程序目錄,AndroidNdkDemo示例的應(yīng)用程序目錄為ndk-demo在ndk-demo目錄中建立一個(gè)空目錄project,這個(gè)目錄以后會(huì)用來存放Android工程在ndk-demo目錄中建立一個(gè)名為Application.mk的文件,用來描述Android工程將調(diào)用的共享庫AndroidNdkDemo示例的目錄結(jié)構(gòu),10.3 NDK開發(fā)示例,建立Application.mk文件在進(jìn)行NDK開發(fā)時(shí),在應(yīng)用程序目錄中一定要有

15、Application.mk文件,用來聲明Android工程需要調(diào)用的非托管模塊(如靜態(tài)庫或共享庫)AndroidNdkDemo示例的Application.mk的代碼如下第1行的變量APP_PROJECT_PATH表示Android工程所在的目錄,在生產(chǎn)共享庫文件后,APK將自動(dòng)將共享庫文件拷貝到\libs\armeabi目錄中,本示例將共享庫文件拷貝到apps\ndk-demo\project\libs\armeabi目錄中

16、,10.3 NDK開發(fā)示例,建立Application.mk文件第2行代碼中的變量APP_MODULES表示Android工程需要調(diào)用的非托管模塊,如果存在多個(gè)非托管模塊,使用空格進(jìn)行分隔。本示例調(diào)用的非托管模塊為add-module,對(duì)應(yīng)在后面涉及的Android.mk文件Application.mk的變量說明,10.3 NDK開發(fā)示例,建立Android工程在project目錄中建立Android工程時(shí),需要取消復(fù)選框“Use

17、 default location”,并指定預(yù)先建立的project文件夾作為工程文件夾在建立AndroidNdkDemo工程后,修改main.xml文件,添加一個(gè)id為display的TextView和一個(gè)id為add_btn的Button按鈕,10.3 NDK開發(fā)示例,建立Android工程程序中的生產(chǎn)隨機(jī)數(shù)和調(diào)用的代碼在AndroidNdkDemo.java文件中,下面是AndroidNdkDemo.java文件的核

18、心代碼,10.3 NDK開發(fā)示例,建立Android工程,10.3 NDK開發(fā)示例,建立Android工程上面的代碼有一個(gè)NDK開發(fā)的小技巧,在開發(fā)C/C++的共享庫前,可以使用具有相同和相近功能的Java函數(shù)進(jìn)行替代。在代碼第17行本應(yīng)該調(diào)用共享庫的add()函數(shù),但為了便于開發(fā)和調(diào)試,在代碼第25行到第27行,使用Java代碼開發(fā)了一個(gè)功能相同的add()函數(shù),這樣即使在沒有完成C/C++的共享庫開發(fā)前,也可以對(duì)這個(gè)Android

19、工程進(jìn)行界面部分的調(diào)試第16行和第23行注釋掉的代碼,就是在C/C++的共享庫開發(fā)完畢后需要使用的代碼,其中第16行是動(dòng)態(tài)加載共享庫的代碼,加載的共享庫名稱為add-module;第23行用來聲明共享庫的函數(shù),使用C/C++開發(fā)的共享庫必須有同名的函數(shù)。在共享庫開發(fā)完畢后,取消第16行和第23行代碼的注釋,并注釋掉第25行到第27行代碼,這樣程序就可以正常調(diào)用共享庫內(nèi)的函數(shù)進(jìn)行加法運(yùn)算,10.3 NDK開發(fā)示例,建立Android.m

20、k文件建立C/C++源代碼文件前,首先需要在sources目錄中建立模塊目錄,AndroidNdkDemo示例的模塊目錄為add-module,這個(gè)模塊目錄的名稱與Application.mk文件中聲明的模塊名稱相同add-module目錄中包含兩個(gè)文件,Android.mk和add-module.c,目錄結(jié)構(gòu)如下,10.3 NDK開發(fā)示例,建立Android.mk文件Android.mk是為NKD編譯系統(tǒng)準(zhǔn)備的腳本文件,用來描述

21、模塊需要編譯C/C++文件的信息通常NKD編譯系統(tǒng)會(huì)搜尋$NDK/sources/*/目錄中的所有Android.mk文件,但如果程序開發(fā)人員將Android.mk文件放置在下一級(jí)目錄中,則需要在上一級(jí)目錄中的Android.mk文件添加如下代碼,10.3 NDK開發(fā)示例,建立Android.mk文件下面來分析AndroidNdkDemo示例的add-module模塊的Android.mk文件Android.mk文件的代碼如下,1

22、0.3 NDK開發(fā)示例,建立Android.mk文件每個(gè)Android.mk文件都必須以第1行代碼開始,變量LOCAL_PATH用來定義需要編譯的C/C++源代碼的位置,my-dir由NKD編譯系統(tǒng)提供,表示當(dāng)前目錄的位置。代碼第3行的include $(CLEAR_VARS)表示清空所有以LOCAL_開始的變量,例如LOCAL_MODULE、LOCAL_SRC_FILES、LOCAL_STATIC_LIBRARIES等,但第1行定義

23、的LOCAL_PATH不在清空的范圍內(nèi)。因?yàn)樗械哪_本都將粘貼到同一個(gè)GNU Make的執(zhí)行上下文中,而且所有變量都是全局變量,因此必須在每次使用前清空所有以前用過的變量,10.3 NDK開發(fā)示例,建立Android.mk文件第5行代碼變量LOCAL_MODULE用來聲明模塊名稱,模塊名稱必須唯一,而且中間不能夠存在空格。NKD編譯系統(tǒng)將會(huì)在模塊名稱前自動(dòng)添加lib前綴,然后生產(chǎn)so文件。這里的模塊名稱為add-module,生產(chǎn)的共

24、享庫文件名為libadd-module.so。但需要注意的是,如果程序開發(fā)人員使用具有l(wèi)ib前綴的模塊名稱,NKD編譯系統(tǒng)將不再添加前綴,例如模塊名稱為libsub,生產(chǎn)的共享庫文件名為libsub.so,10.3 NDK開發(fā)示例,建立Android.mk文件第6行代碼中的變量LOCAL_SRC_FILES表示編譯模塊所需要使用的C/C++文件列表,但不需要給出頭文件的列表,因?yàn)镹KD編譯系統(tǒng)會(huì)自動(dòng)計(jì)算依賴關(guān)系。add-module模

25、塊僅需要一個(gè)C文件,文件名為add-module.c。缺省情況下,結(jié)尾名為.c的文件是C語言源文件,結(jié)尾名為.cpp的文件是C++語言源文件第8行代碼include $(BUILD_SHARED_LIBRARY)表示NKD編譯系統(tǒng)構(gòu)建共享庫,如果變量BUILD_SHARED_LIBRARY更改為BUILD_STATIC_LIBRARY,則表示需要NKD編譯系統(tǒng)構(gòu)建靜態(tài)庫,10.3 NDK開發(fā)示例,建立C源代碼文件根據(jù)Android.

26、mk文件的聲明,add-module模塊僅包含一個(gè)C源代碼文件add-module.c。add-module.c文件的作用是實(shí)現(xiàn)兩個(gè)整數(shù)加法運(yùn)算功能,全部代碼如下,10.3 NDK開發(fā)示例,建立C源代碼文件第1行代碼引入的是JNI(Java Native Interface)的頭文件第3行代碼是函數(shù)名稱,jlong表示Java長(zhǎng)型整數(shù),Java_edu_hrbeu_AndroidNdkDemo_AndroidNdkDemo_add的

27、構(gòu)成為Java___,其中的名稱和參數(shù)要與AndroidNdkDemo.java文件定義的函數(shù)一致,AndroidNdkDemo.java文件定義的函數(shù)為public native long add(long x, long y)第5行代碼用來返回加法運(yùn)算結(jié)果,10.3 NDK開發(fā)示例,編譯共享庫模塊首先啟動(dòng)cygwin,然后切換到Androd NDK的主目錄下,鍵入如下的編譯命令ndk-demo是apps目錄下的應(yīng)用程序目

28、錄名稱。在指定應(yīng)用程序(目錄)名稱后,NKD編譯系統(tǒng)會(huì)首先找到目錄中的Application.mk文件,根據(jù)Application.mk文件的信息,確定該Android共享需要使用add-module模塊;然后在sources目錄中搜索所有Android.mk文件,在找到與add-module模塊匹配的Android.mk文件后,根據(jù)Android.mk文件提供的信息編譯指定的C/C++源代碼文件,形成共享庫文件;最后將生產(chǎn)的共享庫文件

29、拷貝到Android工程的指定目錄中,10.3 NDK開發(fā)示例,編譯共享庫模塊目前Android NDK 1.5版本存在一個(gè)小錯(cuò)誤,如果用戶直接運(yùn)行make APP=ndk-demo命令編譯程序,NDK編譯系統(tǒng)將提示out/host/config.mk文件不存在,讓用戶重新運(yùn)行build/host-setup.sh腳本解決這問題的方法非常簡(jiǎn)單,只需要將/build/out/host文件夾和其中的config.mk文件拷貝到

30、/out目錄中即可,10.3 NDK開發(fā)示例,編譯共享庫模塊下圖是編譯成功的提示信息提示信息包括編譯add-module模塊所使用到的文件,生產(chǎn)so文件的文件名和so文件的安裝位置。為了確認(rèn)是否成功編譯了模塊,用戶可以打開apps/ndk-demo/project/libs/armeabi目錄,如果目錄中存在libadd-module.so文件,則表示編譯成功,10.3 NDK開發(fā)示例,運(yùn)行Android程序在運(yùn)行And

31、roidNdkDemo示例程序前,務(wù)必將AndroidNdkDemo.java文件中第16行和第23行的注釋取消,并注釋掉第25行到第27行代碼,習(xí)題:,1.簡(jiǎn)述Android NDK開發(fā)的優(yōu)勢(shì)和不足。2.說明Android NDK應(yīng)用程序開發(fā)的一般步驟。3.參考NDK的tow-libs示例,使用靜態(tài)庫實(shí)現(xiàn)AndroidNdkDemo示例中加法運(yùn)算的函數(shù)功能。4.使用NDK能夠提高復(fù)雜函數(shù)的運(yùn)算速度,但程序運(yùn)行效率的提升并不容易度

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論