Android底層軟硬件開發(fā)技術(shù)22課件_第1頁
Android底層軟硬件開發(fā)技術(shù)22課件_第2頁
Android底層軟硬件開發(fā)技術(shù)22課件_第3頁
Android底層軟硬件開發(fā)技術(shù)22課件_第4頁
Android底層軟硬件開發(fā)技術(shù)22課件_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費閱讀

付費下載

下載本文檔

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

文檔簡介

Android底層軟硬件

開發(fā)技術(shù)中智訊培訓(xùn)中心2013-5Android底層代碼框架Android底層代碼框架主要議題AndroidNDK開發(fā)技術(shù)*2NDK示例-LED軟硬件開發(fā)技術(shù)Android是一個開源的嵌入式通用操作系統(tǒng)平臺,采用標(biāo)準(zhǔn)Linux作為內(nèi)核Android的源碼任何廠商都可以獲取,并且基于自己的硬件架構(gòu)開發(fā)私有系統(tǒng)嵌入式硬件的多樣化造成軟件開發(fā)跟硬件結(jié)合比較緊密隨著Android系統(tǒng)“通用化”,各種千差萬別的“嵌入式”產(chǎn)品將“不滿足”現(xiàn)有的系統(tǒng)軟件框架,通過軟硬件開發(fā)技術(shù),衍生出各種專有系統(tǒng)*3Android系統(tǒng)框架*4軟硬件結(jié)合代碼HAL硬件抽象層HAL(Hardware

Abstract

Layer)硬件抽象層是Google開發(fā)的Android系統(tǒng)里上層應(yīng)用對底層硬件操作屏蔽一個軟件層次,說白了,就是上層的應(yīng)用不用關(guān)心底層硬件具體如何工作的,只要向上層提供一個統(tǒng)一的接口即可,這種設(shè)計思想廣泛的存在于當(dāng)前的軟件架構(gòu)設(shè)計里。*5HAL硬件抽象層新的HAL架構(gòu)采用HALstub形式,Stub向HAL提供操作函數(shù)(operations),而runtime則是向HAL取得特定模塊(stub)的operations,再callback這些操作函數(shù)。這種以indirectfunctioncall的架構(gòu),讓HALstub變成是一種包含關(guān)系,即HAL里包含了許許多多的stub。Runtime只要說明類型,即moduleID,就可以取得操作函數(shù)。對于目前的HAL,可以認(rèn)為Android定義了HAL層結(jié)構(gòu)框架,通過幾個接口訪問硬件從而統(tǒng)一了調(diào)用方式。*6HAL硬件抽象層*7HAL層存在的意義并不是所有的硬件設(shè)備都有標(biāo)準(zhǔn)的Linuxkernel的接口;Kerneldriver涉及到GPL的版權(quán),某些設(shè)備制造商并不愿意公開硬件驅(qū)動,所以才通過HAL方式繞過GPL;針對某些硬件Android有一些特殊的需求。*8AndroidJNI調(diào)用JNI(JavaNativeInterface)是本地編程接口,它使得在Java虛擬機(VM)內(nèi)部運行的Java代碼能夠與其它編程語言編寫的應(yīng)用程序和庫進(jìn)行交互操作。JNI一般有以下一些應(yīng)用場景:高性能要求:如一些圖形的處理,運算量非常大,直接使用java是不能勝任;調(diào)用驅(qū)動:如調(diào)用一些外部系統(tǒng)接口的驅(qū)動--讀卡器的驅(qū)動,OCI驅(qū)動;使用大內(nèi)存:如進(jìn)程內(nèi)Cache,遠(yuǎn)遠(yuǎn)超過VM所能分配的內(nèi)存;調(diào)用系統(tǒng)服務(wù):如java調(diào)用搜索服務(wù),搜索是由C/C++實現(xiàn)的。*9AndroidJNI調(diào)用由于Android的應(yīng)用層是以Java語言開發(fā)的,使用下層c/c++庫提供的服務(wù)時需使用JNI在Android源碼中,主要的JNI代碼(C++源文件)放在以下的路徑中:frameworks/base/core/jni/。被編譯成動態(tài)庫libandroid_runtime.so使用Android已實現(xiàn)的JNI動態(tài)庫,需要額外連接動態(tài)庫libnativehelper.so對于開發(fā)者自己實現(xiàn)的JNI動態(tài)庫*.so文件可以與Java應(yīng)用一起打包到apk文件中。*10Android底層開發(fā)方法NDK開發(fā):從應(yīng)用角度來開發(fā)軟硬結(jié)合代碼適用于單個應(yīng)用程序的底層結(jié)合需求HAL硬件抽象層開發(fā):從整個系統(tǒng)框架需求角度來開發(fā)本地程序適用于共享功能軟硬結(jié)合代碼應(yīng)用程序的底層結(jié)合需求*11Android底層代碼框架主要議題AndroidNDK開發(fā)技術(shù)*12NDK示例-LEDAndroid

NDK開發(fā)技術(shù)NDK開發(fā)技術(shù)介紹AndroidNDKNDK(AndroidNativeDevelopmentKit)是一系列的開發(fā)工具,允許程序開發(fā)人員在Android應(yīng)用程序中嵌入C/C++語言編寫的非托管代碼AndroidNDK優(yōu)勢解決了核心模塊使用托管語言開發(fā)執(zhí)行效率低下的問題允許程序開發(fā)人員直接使用C/C++源代碼,極大的提高了Android應(yīng)用程序開發(fā)的靈活性AndroidNDK不足增加程序的例如信號處理或物理仿真)使用非托管代碼運行效率最高,復(fù)雜性,增加了程序調(diào)試的難度CPU運算量大和內(nèi)存消耗較少的部分(因此并不是所有的核心部分都適合使用C/C++語言編寫)*13NDK開發(fā)技術(shù)介紹AndroidNDK集成了交叉編譯器,支持ARMv5TE處理器指令集、JNI接口和一些穩(wěn)定的庫文件AndroidNDK提供一系列的說明文檔、示例代碼和開發(fā)工具,指導(dǎo)程序開發(fā)人員使用C/C++語言進(jìn)行庫文件開發(fā),并提供便捷工具將庫文件打包到apk文件中AndroidNDK編譯環(huán)境支持WindowsXP、Linux和MacOS*14NDK理解誤區(qū)*15NDK發(fā)布之前,Android不支持進(jìn)行C開發(fā)有了NDK,我們可以使用純C開發(fā)Android應(yīng)用JAVA+C應(yīng)用場景*16JAVA+C高性能的應(yīng)用邏輯保密的應(yīng)用邏輯特殊需求(平臺相關(guān))實現(xiàn)特殊功能提高程序執(zhí)行效率防止反編譯NDK環(huán)境構(gòu)建NDK根據(jù)Android版本的更新也一直在升級,本實驗采用最新的android-ndk-r8d版本NDK開發(fā)包的安裝解壓縮安裝包到D盤根目錄(DISK-S210xA80\04-常用工具\Android\android-ndk-r8d-windows.zip)修改系統(tǒng)環(huán)境變量PATH:;D:\android-ndk-r8d;增加系統(tǒng)環(huán)境變量NDK:D:\android-ndk-r8d*17NDK環(huán)境構(gòu)建由于NDK編譯代碼時必須要用到make和gcc,所以你必須先搭建一個linux環(huán)境,cygwin是一個在windows平臺上運行的unix模擬環(huán)境完整版本的cygwin安裝包大且安裝復(fù)雜,中智訊提供了實驗所必需的最小精簡版本將cygwin工具包解壓縮到D盤根目錄(DISK-S210xA80\04-常用工具\Android\cygwin.zip)雙擊D:\cygwin目錄下的cygwin.reg導(dǎo)入注冊信息*18注意:如果用戶改變cygwin安裝路徑,需要對應(yīng)修改文件:

cygwin.bat、

cygwin.reg、

zbuild.batcygwin安裝路徑內(nèi)不能包含中文路徑NDK環(huán)境構(gòu)建NDK環(huán)境驗證*19NDK開發(fā)步驟使用Eclipse創(chuàng)建自己的工程hello-jni;在工程hello-jni目錄下創(chuàng)建兩個文件夾jni和src,jni用來放我們的c/c++文件,src是調(diào)用庫的java接口文件;在jni文件夾下創(chuàng)建你的c/c++文件和Andriod.mk文件;修改src目錄下層的java文件HelloJni.java,注意用native聲明JNI函數(shù),并調(diào)用jni生成的so庫;將zbuild.bat執(zhí)行腳本文件拷貝到工程hello-jni目錄下,運行該腳本文件將會自動編譯jni下的代碼,最終在libs\armeabi下生成so庫文件;在Eclipse選擇執(zhí)行方式為AndroidApplication,點擊run,將會編譯工程并安裝編譯好的apk文件到硬件平臺,此時so文件也會自動打包到APK文件中,同時也會安裝到系統(tǒng)對應(yīng)程序的lib目錄下。*20NDK工程實例-hello-jnihello-jni是NDK自帶的jni實例代碼(D:\android-ndk-r8d\samples),它實現(xiàn)從JNI層獲取一段字符串顯示在TextView控件上*21NDK工程框架*22JAVA源文件JNI源文件JNI編譯生成的庫文件JNI編譯腳本程序編碼-HelloJni.java*23publicclassHelloJniextendsActivity{@Override

publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);

TextViewtv=newTextView(this);tv.setText(stringFromJNI());setContentView(tv);}

publicnativeStringstringFromJNI();static{

System.loadLibrary("hello-jni");}}JNI的聲明,注意native關(guān)鍵字加載JNI生成的本地庫程序編碼-hello-jni.c*24#include<string.h>#include<jni.h>jstringJava_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv*env,jobjectthiz){return(*env)->NewStringUTF(env,"HellofromJNI!");}要求遵循一定的命名規(guī)則JNI代碼編寫規(guī)則JNI的實現(xiàn)比較簡單,NDK下JNI文件不需要去注冊方法,只需要本地函數(shù)有標(biāo)準(zhǔn)的命名規(guī)則,例如:本地函數(shù):publicnativeStringstringFromJNI();JNI命名規(guī)則:JNIEXPORTjstringJNICALLJava_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv*env,jobjectthiz){}這里的命名規(guī)則為:類型:JNIEXPORT<JNI函數(shù)類型>JNICALL函數(shù)名:Java_PackageName_ClassName_FunctionNamePackageName是包名,其中的“.”用“_”代替,如果包名中本身含有“_”字符,則用“_1”代替;ClassName是類名,同樣如果類名中包含“_”,則用“_2”代替;FunctionName即為Java中用native聲明的函數(shù)名。參數(shù):JNIENV*env與jobjectobj為默認(rèn)參數(shù),必須得有。*25程序編碼–Android.mk*26LOCAL_PATH:=$(callmy-dir) #當(dāng)前文件路徑include$(CLEAR_VARS) #清空所有以LOCAL_開始的變量(除了LOCAL_PATH)LOCAL_MODULE:=hello-jni #模塊名稱LOCAL_SRC_FILES:=hello-jni.c #源文件include$(BUILD_SHARED_LIBRARY) #編譯成共享庫#include$(BUILD_EXECUTABLE) ##編譯成可執(zhí)行文件代碼編譯通過NDK構(gòu)建環(huán)境來編譯jni源碼雙擊執(zhí)行源碼根目錄下的批處理文件zbuild.bat編譯成功后,會生成庫文件libhello-jni.so(hello-jni\libs\armeabi)*27通過Eclipse編譯HelloJni工程,將會生產(chǎn)HelloJni.apk文件,文件內(nèi)已經(jīng)包含了動態(tài)庫文件libhello-jni.so程序運行將程序安裝到模擬器或者實驗平臺中運行:如果沒有編譯jni代碼,生成的apk文件將不含jni庫文件,直接運行程序會報錯包含jni庫的apk文件安裝時會把so庫部署到程序的lib文件夾內(nèi),當(dāng)需要使用是會加載通過adb工具進(jìn)入到linuxshell界面,可以在so庫文件:*28#cd/data/data/com.example.hellojni/lib#lslibhello-jni.so#pwd/data/data/com.example.hellojni/libAndroid底層代碼框架主要議題AndroidNDK開發(fā)技術(shù)*29NDK示例-LEDNDK示例-LEDNDK編程驅(qū)動LED本實例介紹通過NDK編程來驅(qū)動LED*30ndk-led軟件架構(gòu)*31JAVA源文件JNI源文件HAL源文件LedCtrl.javaLedDevice.javacom_android_x210_LedDevice.cleds_v210_hal.hleds_v210_hal.cled.cAndroidLinuxKernelLinux驅(qū)動HALJNI應(yīng)用層Linux驅(qū)動:leds.c*32/*定義具體的文件操作*/staticconststructfile_operationss5pv210_led_ctrl_ops={.owner=THIS_MODULE,.open=s5pv210_led_open,.read= s5pv210_led_read,.write= s5pv210_led_write,.release= s5pv210_led_release,};HAL層代碼:leds_v210_hal.c*33#include<android/Log.h>#include"leds_v210_hal.h"#defineLOGD(...)__android_log_print(ANDROID_LOG_DEBUG,"keymatch",__VA_ARGS__)#defineFILE_PATH"/dev/led_light"staticintleds_ctrl_open(void){ LOGD("Here:HALfunctionCall:Linuxdiverfunction"); leds_ctrl_fd=open(FILE_PATH,O_RDWR); return0;}staticintleds_ctrl_close(void){ LOGD("Here:HALfunctionCall:Linuxdiverfunction"); close(leds_ctrl_fd); return0;}staticintleds_ctrl_switch_on_off(intnum,intstate){ #num為LED選擇,state為LED的狀態(tài)}staticintleds_ctrl_get_leds_state(intnum){ #num為LED選擇,返回值為LED的狀態(tài)}staticstructleds_ctrl_dev_tledsCtrlDevice={ open :leds_ctrl_open, close :leds_ctrl_close, switch_on_off :leds_ctrl_switch_on_off, get_state :leds_ctrl_get_leds_state};structleds_ctrl_dev_t*get_leds_ctrl_dev(void){ return&ledsCtrlDevice;}JNI層代碼:com_android_x210_LedDevice.c*34#include<android/log.h>//NDK實現(xiàn)JNI時,如果要使用LOGD函數(shù),在源文件中必須包含如下頭文件#defineLOGD(...)__android_log_print(ANDROID_LOG_DEBUG,"keymatch",__VA_ARGS__)staticstructleds_ctrl_dev_t*ledsCtrlDev=NULL;JNIEXPORTjintJNICALLJava_com_android_x210_LedDevice_opendevice(JNIEnv*env,jobjectobj){ ledsCtrlDev=get_leds_ctrl_dev(); returnledsCtrlDev->open();}JNIEXPORTjintJNICALLJava_com_android_x210_LedDevice_closedevice(JNIEnv*env,jobjectobj){ LOGD("Here:JNInativefunctionCall:HALfunction"); returnledsCtrlDev->close();}JNIEXPORTjintJNICALLJava_com_android_x210_LedDevice_switchonoff(JNIEnv*env,jobjectobj,jintnum,jinton_off){ LOGD("Here:JNInativefunctionCall:HALfunction"); returnledsCtrlDev->switch_on_off(num,on_off);}JNIEXPORTjintJNICALLJava_com_android_x210_LedDevice_getstate(JNIEnv*env,jobjectobj,jintnum){ LOGD("Here:JNInativefunctionCall:HALfunction"); returnledsCtrlDev->get_state(num);}Android.mk*35#StaticLibraryLOCAL_PATH:=$(callmy-dir) #當(dāng)前文件路徑include$(CLEAR_VARS) #清空所有以LOCAL_開始的變量(除了LOCAL_PATH)LOCAL_MODULE:=libleds_hal #HAL層庫名LOCAL_SRC_FILES:=leds_v210_hal.c #HAL層源文件LOCAL_LDLIBS:=-L$(SYSROOT)/usr/lib–llog #NDK使用LOG選項include$(BUILD_STATIC_LIBRARY) #將HAL層代碼編譯成靜態(tài)庫#SharedLibraryinclude$(CLEAR_VARS) #清空所有以LOCAL_開始的變量(除了LOCAL_PATH)LOCAL_MODULE:=libledsctrl_jni #JNI層庫名LOCAL_SRC_FILES:=com_android_x210_LedDevice.c #JNI層源文件LOCAL_LDLIBS:=-L$(SYSROOT)/usr/lib-llogLOCAL_STATIC_LIBRARIES:=libleds_hal #包含HAL層靜態(tài)庫include$(BUILD_SHARED_LIBRARY) #將JNI層代碼編譯成動態(tài)態(tài)庫應(yīng)用層本地代碼:LedDevice.java*36publicclassLedDevice{static{Log.i("JNI","Tryingtoloadlibled.so");

System.loadLibrary("ledsctrl_jni");}

publicstaticintopen(){Log.d(TAG,"Here:javaframeworkCall:JNInativefunction");returnopendevice();}

publicstaticintclose(){Log.d(TAG,"Here:javafram

溫馨提示

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

最新文檔

評論

0/150

提交評論