版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、設(shè)備驅(qū)動(dòng)外傳-傳感器的Android Java Framework框架層 收藏 1.體系結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)四大函數(shù)本文以重力感應(yīng)器裝置G-sensor為例探索Android的各層次結(jié)構(gòu)。1.體系結(jié)構(gòu)Android的體系結(jié)構(gòu)可分為4個(gè)層次。丁即3應(yīng)用程序用戶空間Java F工ajiLBW匚1工k框架層n ager.ja /a Sen sorSer/tce. javaJNIaa rdwa re_ SensorMa ager. cppcom android ser/er SensorSer/:ce. cpp璇件抽家層sensors, cpp內(nèi)核空間,G- s已nsn工設(shè)備驅(qū)動(dòng)程序a220 driver.c
2、硬件:宜龍函妁工重力感應(yīng)器第一層次底層驅(qū)動(dòng)層,包括標(biāo)準(zhǔn)Linux,Android核心驅(qū)動(dòng),Android相關(guān)設(shè)備驅(qū)動(dòng),G-sensor的設(shè)備驅(qū)動(dòng)程序即存在于此第二層次Android標(biāo)準(zhǔn)C/C+庫,包括硬件抽象層,Android各底層庫, 本地庫,JNI 第三層次 Android Java Framwork 框架層第四層次Java應(yīng)用程序本文重點(diǎn)關(guān)注硬件抽象層,JNI以及Frameworko1.1硬件抽象層硬件抽象層通過例如 open(), read(), write(), ioctl(), poll()等函 數(shù)調(diào)用的方式,與底層設(shè)備驅(qū)動(dòng)程序進(jìn)行交互,而這些函數(shù)調(diào)用是底層設(shè)備驅(qū)動(dòng) 程序事先準(zhǔn)備好
3、的。用于交互的關(guān)鍵是文件描述符fd,fd通過open()打開G-sensor設(shè)備節(jié) 點(diǎn)而得到,即 fd = open (/dev/bma220,O_RDONLY);而/dev/bma220 這個(gè)設(shè) 備節(jié)點(diǎn)是在底層設(shè)備驅(qū)動(dòng)中注冊(cè)完成的。其他的函數(shù)調(diào)用如read(), write()等都通過該文件描述符fd對(duì) G-sensor設(shè)備進(jìn)行操作。JNI (Java Native Interface)JNI層可以認(rèn)為是整個(gè)體系結(jié)構(gòu)中的配角,概括地講,它就完成了一項(xiàng)任 務(wù),既實(shí)現(xiàn)從C+語言到Java語言的轉(zhuǎn)換。JNI層為Java Framework層提供一 系列接口,而這些接口函數(shù)的具體實(shí)現(xiàn)中,利用例如mo
4、dule-methods-open(), sSensorDevice-data_open(), sSensorDevice-poll()等回調(diào)函數(shù)與硬件抽象 層進(jìn)行交互。而 這些open(), poll ()回調(diào)函數(shù)在硬件抽象層中具體實(shí)現(xiàn)。Java FrameworkFramework層提供各種類和類的對(duì)象,可作為系統(tǒng)的守護(hù)進(jìn)程運(yùn)行,也可 供上層應(yīng)用程序的使用。例如類SensorManager,它作為系統(tǒng)的守護(hù)進(jìn)程在初始化的時(shí)候開始運(yùn) 行,其子類 SensorThread 中的子類 SensorThreadRunnable 通過 sensors_data_poll()實(shí)現(xiàn)了對(duì)G-sensor數(shù)
5、據(jù)的輪訓(xùn)訪問,而 sensors_data_poll()通過JNI層轉(zhuǎn)換到硬件抽象層去具體實(shí)現(xiàn)poll()。2數(shù)據(jù)結(jié)構(gòu)一般境況下,硬件抽象層對(duì)硬件的描述都分為control和data兩大類。sensors control context tstruct sensors_control_context_t (struct sensors_control_device_t device;int fd;struct sensors_control_device_t (struct hw_device_t common;int (*open_data_source)(struct sensors_co
6、ntrol_device_t *dev);int (*activate)(struct sensors_control_device_t *dev, int handle,int enabled);int (*set_delay)(struct sensors_control_device_t *dev, int32_t ms);int (*wake)(struct sensors_control_device_t *dev);sensors data context tstruct sensors_data_context_t (struct sensors_data_device_t de
7、vice;int fd;struct sensors_data_device_t (struct hw_device_t common;int (*data_open)(struct sensors_data_device_t *dev, int fd);int (*data_close)(struct sensors_data_device_t *dev);int (*poll)(struct sensors_data_device_t *dev, sensors_data_t* data);struct hw_device_t (uint32_t tag; uint32_t version
8、;struct hw_module_t* module;int (*close)(struct hw_device_t* device);struct hw_module_t (uint32_t tag; uint16_t version_major; uint16_t version_minor;const char *id; const char *name; const char *author;struct hw_module_methods_t* methods;struct hw_module_methods_t (int (*open)(const struct hw_modul
9、e_t* module, const char* id, struct hw_device_t* device);下文將通過對(duì)(*open), (*open_data_source), (*data_open)和(*poll)的代碼 分析,探索Android的各層次架構(gòu)。3四大函數(shù)3.1 module-methods-open()class SensorService extends ISensorSemce.Stub 中/一SuppressWarninglunusedl,Jpublic Sen so rS e ivi c e (C o ntexl. t o ntextXfJsensorcon
10、troIJnitQ;public returIDarcelFileDescriptor gstDataChanelO th rows R e m ote E)i e pti o n ie n so rs_c o ntro l_o p e n();=s e ns) rs_c o ntro l_a ctivate (E 日 ns o r, tru e); ens()r_c o ntro Ijs et_d e I ay(m inDei 瀚:、 _sens()rs_co ntrol_wa ke Q;static:JNlhativeMethod gMethods = (f_sen - ofS-Co nt
11、ro IJnif, .01 字(void*).-android_init K ._sensors_control_open, OLandrid/os/ParcelFileDescriptoC, tvoid android_cpen , 令ensorcontrol_activate,(I明1%nid*) android_activate %r_sensors_controLwake, JiKrtvoid*)/android_datawake , f_sen*ors_control_set_ ci邪.剝;炳id androidset_deIstatic jint android_init(JNIE
12、nv.*env, jclass;lazz)sensoj2_module_t* module,i(hvyjg et_m o d u I e f se n r.s! fconst hw_m o d u I&m o d u I e).= 0) if (ensorS-ControLopenjkmodule-common, .sSen$orDevice) = 0) ?nor_r list;dule-getsensorsJisUmodule, &list);const struct s intcount= me return count;1 static inline int sensors_contro
13、l_open(const struct hw_module_t* module, struct sens oTslc o ntro l_d evi t e_t* device)return module-methods?open(module,SENS.ORS_HARDWAREgONTR.OL, (struct hdevice.wake =.wake;efse if gstrcmptname, SENSORS_HARDWARE_DATA)(:d ev- devite-Eommon,close =.s_d evd ata_c lose;dev-d.evice.data_open = s_data
14、_opEn;dd ei ce. d ata_e I os e = s_data_elo$e;dev-device.poll = s_poll;dev*fd =-1;FrameworkSensorService作為系統(tǒng)守護(hù)進(jìn)程運(yùn)行,其類的構(gòu)造函數(shù)實(shí)現(xiàn) _sensors_control_init()。JNI為_sensors_control_init()提供接口 android_init(),并執(zhí)行回調(diào)函數(shù) module-methods-open();硬件抽象層具體實(shí)現(xiàn)(*open),該函數(shù)為所有G-sensor回調(diào)函數(shù)的指針賦值。sSensorDevice-open data source()F
15、rameworkJNI硬件抽象層SensorSerice.javaorr. android server SensorService. cppsensor: cpp叩-mms /中=50_./中?10 mroLmo-1 . j . . . T3Lltl=.mFa.r:CD-F-CDDCDs2mclr gCDoasrctlanCDoi=己京皿 RCDmoiCDE 告CDm-on f rCDklrnmCDnsorcflo口 mro-ICIPCDn三: 1 - ECDnc/Jcl可Jconircl -la c-vafCD-sCDll.”。r- -ruCDM% e 澆 a 稀h己-i-id e -sm
16、 - n D e - ay)-.wCDn5o0coHrcl-rwD-g芬-JN-NaCDMCDinod gmmincldsnzclmCDworcnloMro_1_ - .言A當(dāng)drmdl-n一 iI蜜 nwcl蒞ccls.己lcllcl當(dāng)k-OLand 己-Em四parcE-F-m口Esrr-mclf -號(hào)-3and 己一產(chǎn) CIICIEn* %w-CDn 皿o思c 0s.己 _gi,aiCD-MZJN-m.5當(dāng) d 己-daHMiCDA f _.|屹當(dāng)山oreu0 rurokCD-_-.- 0-峰0一 口5 當(dāng) d ro- dlda5rf急罷 e - J.- _.-|饋 n !&S.己廠S
17、Eld e -段_或口-3.當(dāng) d 己一 r wild e -晏洌srxo-tl-EH 當(dāng)drmdclla 當(dāng)(JN-EIW* 當(dāng)字丘涇整云冒) A-mfd H EaCDn 中OOEWCCD松OT3當(dāng)daialsoumCD涂 ECDnatioCDopen_data_source();硬件抽象層具體實(shí)現(xiàn)(*open_data_source),該函數(shù)通過打開G-sensor的設(shè)備節(jié)點(diǎn)得到 文件描述符 fd = open (/dev/bma220,O_RDONLY);設(shè)備驅(qū)動(dòng)層通過misc_register()對(duì)G-sensor設(shè)備進(jìn)行注冊(cè),建立設(shè)備節(jié)點(diǎn)。sSensorDevice-dataopen
18、()工OMBUWIJ.由/一 也ajsmc:而巨籽 SLiaJsp u b I it? c I as SensorMai lager extends JRotationWatcher.Stubsitatic private class SeiisorThreadprivate c I aSensorThr eadRiiimable implements Runnable (private ParcelFileDescfiptor mSensrDataFd;SensorThreadRunnable(Parjla.ssFileDescfiptor= e nvr: F i n d CI a s s
19、j ava/i o/F i I e D e scri pto jfieldlD offset= eetFieId!D(FiIeDescriptorr1 descriptor11 ;:J7; intfd = env-GetlntField(fdo, offsetreturn sSensorDevice-data_open(sSensorDevice, fdCLCLCJ-恩 QSCQJ皿statip int :? i上泠 勺;?n truct sensors_data_device_t*device, intstru ct senso 愆ata_c o ntext_tjj d ev;dev= (.
20、stru ct $ 日 nsors_d ata_c o ntextj 零 e9tc e;dev-fd = dupffd);return 0;1) FrameworkSensorManager作為系統(tǒng)守護(hù)進(jìn)程運(yùn)行,其子類SensorThreadRunnable的 彳亍為函數(shù) run()實(shí)現(xiàn) sensors data open()。_Nr nil史final intssnsar -nchranized .ListentJit ssnsar- -t | ski-ss(iscr5_dat3_do-breakif 5en5GrCibjecl!= m for (ini i=0 . i*5i2eLi&tn&
21、iDeleugi- if disleiier hasSt iistneiIjntaccurac.- = dala/.ctor.statu; n. -SetFlaat-.ria. Raaion( e n; : S 成I ntFj:. -36tLonQAna6gi nt:ifTi& 餌turn resJNI為 sensors_data_open()提供接口 sensors_data_open(),并執(zhí)行回調(diào)函數(shù) sSensorDevice-data_open();硬件抽象層具體實(shí)現(xiàn)(*data_open),該函數(shù)的功能就是將已經(jīng)得到的文件描述符fd復(fù) 制一份到sensors_data_contex
22、t結(jié)構(gòu)體中的dev-fd,以便為處理數(shù)據(jù)的回調(diào) 函數(shù)如(*poll)使用。sSensorDevice-poll()pubdc class SerisorManag&re&nds iR-tstion-. atdharStut static pivate clas SensorTtiroarl .pri. te tlmsm SensorThreadRunnabl& htipleitiants Runnable : privatm FarcelFileDascripkif mSensarDataFd;SensorThr&adRLfinablefParsaIFit&Descriptc仲: mSensa
23、rDalaFd = fd:public -GidrunO (final Flnat iflewflcatiBfinal FMfl 跑- newlrbl1|;Final longE = n& lonafl:.i mSe n sorData Fd.0 &tF leDes mot部:.static J TI ird 砌神-1U砒麗。正ilaD斡criptoc# 伽中攔血非氣_口的_黑絲上_* atdqcjlnt sensn rst!ata_ponpiE r&ensfl(is_(iat3_cipse; B0l*,(voFdsen? ordata_dGsa,jfldatArTay vg理 jmtArry
24、 巾!u.C? enscfs_4fftajoH XtFtlUjr, ftraRF Jsens t? _iat3_pc!ll X;snisors_d3td_t dala:int res = .: . c Dl : ,.: isstatic, I ntjJrilEii. . (Class 廂白業(yè) joDjetlftfG:JIjciass FiWescr-tcr = enFlfldCiassCjava iGFiweECrjplof : jiieidiD crrset= en-Geffie(diD(FiieDescrifrtor. descriptor. T; inlfd = eriR-GetinlF
25、ieldiido. cfTset:.relurnisSensofDe?ite. fdstatic i r;t(struct 呂 e nsofs_d;struc! 5 ensc rs_d at3_con1e d_l * de. = islruct 5Ensof5_d3l3_i:c-npaHrd pfd - ;e,fenl5. !ini enr- poJP(&prd. 1, sjiTnecut)en =SMA220_Glitimespecjo_ns(i data-ser)SQr = SENSOR_TPE 也世置蜘 stat* - SENS 劇2 昨唳翊 里 =return S_HArJDLE_ORIEHI-riCstatic I ntstruct sen s 岫_弓肅 _de-ice_t de ;ice. int .struct s ensof s_d ata_conlepoll(sSensorDevice, &data);其中,得到的 data 就是從底層 傳上來的G-sensor數(shù)據(jù),然后通過下圖的方式將data中對(duì)應(yīng)的數(shù)據(jù)分別賦給 values, status 和 timestamp。jint accuracy = d ata. ;e ctor, status:e nv- S etF I o at.
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度中醫(yī)養(yǎng)生產(chǎn)品海外市場(chǎng)推廣合同4篇
- 2025年度商業(yè)綜合體承包轉(zhuǎn)讓合同范本4篇
- 2025年度養(yǎng)老機(jī)構(gòu)場(chǎng)地租賃與養(yǎng)老服務(wù)分成管理合同3篇
- 2025年cfg樁基施工項(xiàng)目環(huán)境保護(hù)與生態(tài)修復(fù)合同3篇
- 2025年度智能家電維修個(gè)人勞務(wù)協(xié)議書4篇
- 2025年中國酚氨咖敏顆粒行業(yè)發(fā)展?jié)摿Ψ治黾巴顿Y戰(zhàn)略咨詢報(bào)告
- 2025年度汽車租賃與二手車交易服務(wù)合同3篇
- 2025年溫州家和物業(yè)管理有限公司招聘筆試參考題庫含答案解析
- 2025年溫州個(gè)人房屋買賣合同(含交易資金監(jiān)管)3篇
- 二零二五版離婚協(xié)議書模板:離婚后子女撫養(yǎng)及財(cái)產(chǎn)分割專案協(xié)議2篇
- 氧氣霧化吸入法
- 6月大學(xué)英語四級(jí)真題(CET4)及答案解析
- 氣排球競(jìng)賽規(guī)則
- 電梯維修保養(yǎng)報(bào)價(jià)書模板
- 危險(xiǎn)化學(xué)品目錄2023
- FZ/T 81024-2022機(jī)織披風(fēng)
- GB/T 33141-2016鎂鋰合金鑄錠
- 2023譯林版新教材高中英語必修二全冊(cè)重點(diǎn)短語歸納小結(jié)
- JJF 1069-2012 法定計(jì)量檢定機(jī)構(gòu)考核規(guī)范(培訓(xùn)講稿)
- 綜合管廊工程施工技術(shù)概述課件
- 公積金提取單身聲明
評(píng)論
0/150
提交評(píng)論