ZNDS智能電視網 推薦當貝市場

TV應用下載 / 資源分享區(qū)

軟件下載 | 游戲 | 討論 | 電視計算器

綜合交流 / 評測 / 活動區(qū)

交流區(qū) | 測硬件 | 網站活動 | Z幣中心

新手入門 / 進階 / 社區(qū)互助

新手 | 你問我答 | 免費刷機救磚 | ROM固件

查看: 21964|回復: 0
上一主題 下一主題
[教程]

在Ubuntu上為Android系統(tǒng)的Application Frameworks層增加硬件訪問服務

[復制鏈接]
跳轉到指定樓層
樓主
發(fā)表于 2013-8-28 16:30 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
在數(shù)字科技日新月異的今天,軟件和硬件的完美結合,造就了智能移動設備的流行。今天大家對iOS和Android系統(tǒng)的趨之若鶩,一定程度上是由于這兩個系統(tǒng)上有著豐富多彩的各種應用軟件。因此,軟件和硬件的關系,在一定程度上可以說,硬件是為軟件服務的。硬件工程師研發(fā)出一款硬件設備,自然少了軟件工程師為其編寫驅動程序;而驅動程序的最終目的,是為了使得最上層的應用程序能夠使用這些硬件提供的服務來為用戶提供軟件功能。對Android系統(tǒng)上的應用軟件來說,就是要在系統(tǒng)的Application Frameworks層為其提供硬件服務。在前面的幾篇文章中,我們著重介紹了Linux內核層、硬件抽象層和運行時庫層提供的自定義硬件服務接口,這些接口都是通過C或者C++語言來實現(xiàn)的。在這一篇文章中,我們將介紹如何在Android系統(tǒng)的Application Frameworks層提供Java接口的硬件服務。   
   
      一. 參照在Ubuntu為Android硬件抽象層(HAL)模塊編寫JNI方法提供Java訪問硬件服務接口一文所示,為硬件抽象層模塊準備好JNI方法調用層。   
   
      二. 在Android系統(tǒng)中,硬件服務一般是運行在一個獨立的進程中為各種應用程序提供服務。因此,調用這些硬件服務的應用程序與這些硬件服務之間的通信需要通過代理來進行。為此,我們要先定義好通信接口。進入到frameworks/base/core/java/android/os目錄,新增IHelloService.aidl接口定義文件:   
   
      USER-NAME@MACHINE-NAME:~/Android$ cd frameworks/base/core/java/android/os   
   
      USER-NAME@MACHINE-NAME:~/Android/frameworks/base/core/java/android/os$ vi IHelloService.aidl   
   
      IHelloService.aidl定義了IHelloService接口:   
  1. package android.os;   
       
    interface IHelloService {   
        void setVal(int val);   
        int getVal();   
    }   
復制代碼
IHelloService接口主要提供了設備和獲取硬件寄存器val的值的功能,分別通過setVal和getVal兩個函數(shù)來實現(xiàn)。   
   
   三.返回到frameworks/base目錄,打開Android.mk文件,修改LOCAL_SRC_FILES變量的值,增加IHelloService.aidl源文件:   
   
   ## READ ME: ########################################################   
   
   ##   
   
   ## When updating this list of aidl files, consider if that aidl is   
   
   ## part of the SDK API. If it is, also add it to the list below that   
   
   ## is preprocessed and distributed with the SDK. This list should   
   
   ## not contain any aidl files for parcelables, but the one below should   
   
   ## if you intend for 3rd parties to be able to send those objects   
   
   ## across process boundaries.   
   
   ##   
   
   ## READ ME: ########################################################   
   
   LOCAL_SRC_FILES += /   
   
   ....................................................................   
   
   core/java/android/os/IVibratorService.aidl /   
   
   core/java/android/os/IHelloService.aidl /   
   
   core/java/android/service/urlrenderer/IUrlRendererService.aidl /   
   
   .....................................................................   
   
    四. 編譯IHelloService.aidl接口:   
    USER-NAME@MACHINE-NAME:~/Android$ mmm frameworks/base   
   這樣,就會根據IHelloService.aidl生成相應的IHelloService.Stub接口。   
   
   五.進入到frameworks/base/services/java/com/android/server目錄,新增HelloService.java文件:   
  1. package com.android.server;   
    import android.content.Context;   
    import android.os.IHelloService;   
    import android.util.Slog;   
    public class HelloService extends IHelloService.Stub {   
            private static final String TAG = "HelloService";   
            HelloService() {   
                    init_native();   
            }   
            public void setVal(int val) {   
                    setVal_native(val);   
            }           
            public int getVal() {   
                    return getVal_native();   
            }   
               
            private static native boolean init_native();   
                private static native void setVal_native(int val);   
            private static native int getVal_native();   
    };   
復制代碼
HelloService主要是通過調用JNI方法init_native、setVal_native和getVal_native(見在Ubuntu為Android硬件抽象層(HAL)模塊編寫JNI方法提供Java訪問硬件服務接口一文)來提供硬件服務。   
   
     六. 修改同目錄的SystemServer.java文件,在ServerThread::run函數(shù)中增加加載HelloService的代碼:   
   
     @Override   
   
     public void run() {   
   
     ....................................................................................   
   
            try {   
   
                  Slog.i(TAG, "DiskStats Service");   
   
                  ServiceManager.addService("diskstats", new DiskStatsService(context));   
   
            } catch (Throwable e) {   
   
                  Slog.e(TAG, "Failure starting DiskStats Service", e);   
   
            }   
   
            try {   
   
                  Slog.i(TAG, "Hello Service");   
   
                  ServiceManager.addService("hello", new HelloService());   
   
            } catch (Throwable e) {   
   
                  Slog.e(TAG, "Failure starting Hello Service", e);   
   
            }   
   
     ......................................................................................   
   
     }         
   
     七. 編譯HelloService和重新打包system.img:   
   
     USER-NAME@MACHINE-NAME:~/Android$ mmm frameworks/base/services/java   
   
     USER-NAME@MACHINE-NAME:~/Android$ make snod   
   
     這樣,重新打包后的system.img系統(tǒng)鏡像文件就在Application Frameworks層中包含了我們自定義的硬件服務HelloService了,并且會在系統(tǒng)啟動的時候,自動加載HelloService。這時,應用程序就可以通過Java接口來訪問Hello硬件服務了。我們將 在下一篇文章中描述如何編寫一個Java應用程序來調用這個HelloService接口來訪問硬件,敬請期待

上一篇:在Ubuntu上為Android系統(tǒng)內置Java應用程序測試Application Frameworks
下一篇:在Ubuntu為Android硬件抽象層(HAL)模塊編寫JNI方法提供Java訪問
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

Archiver|新帖|標簽|軟件|Sitemap|ZNDS智能電視網 ( 蘇ICP備2023012627號 )

網絡信息服務信用承諾書 | 增值電信業(yè)務經營許可證:蘇B2-20221768 丨 蘇公網安備 32011402011373號

GMT+8, 2025-1-3 18:03 , Processed in 0.057516 second(s), 15 queries , Redis On.

Powered by Discuz!

監(jiān)督舉報:report#znds.com (請將#替換為@)

© 2007-2024 ZNDS.Com

快速回復 返回頂部 返回列表