zoukankan      html  css  js  c++  java
  • 6.2、Android硬件访问服务编写系统代码

    1、实现接口文件给App使用,接口文件是应用程序查询获得服务时获得

      使用AIDL(Android接口定义语言)来实现ILedService.java接口

     定义ILedService.aidl

     interface ILedService

     {

       int IedCtrl(int which,int status);

     }

     把ILedService.aidl放在已经编译好的Android系统源码中的目录:frameworks/base/core/java/android/os目录下,同时修改frameworks/base下的Android.mk文件,其就是makefile文件,其他子目录没有Android.mk文件:仿照其他添加aidl文件添加一句:

    core/java/android/os/ILedService.aidl

    接着在frameworks/base目录下执行:mmm . (该命令会帮我们生成ILedService.java文件,同时执行mmm命令的前提是已经成功编译了Android系统)

    编译的结果会放到out目录下,进入out目录下搜索:“find -name "ILedService.java”

     .out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/os目录下有个ILedService.java文件

    App如果使用:ILedService iLedService;

          iLedService = ILedService .Stub.asInterface(ServiceManager.getService("led"));

          然后调用iLedService.IedCtrl();这个方法会把服务请求发给LedService.java

    2、实现LedService.java(可以参考VibratorService.java振动器服务)

    package com.android.server;

    import android.os.ILedService;

    public class LedService extends ILedService.stub{

      private static final String TAG = "LedService";

      /*call native c function to access hardware*/

      public int ledCtrl(int which ,int status) throws android.os.RemoteException//父类ILedService.stub继承接口ILedService,所以接口里面的ledCtrl要实现,可以参考生成的lLedService.java

      {

        return native_ledCtrl(which ,status);

      }

      //构造函数

      public LedService(){

        native_ledOpen();

      }

      public static native int native_ledCtrl(int which ,int status) ;//这些本地方法由JNI文件提供

      public static native int native_ledOpen() ;

      public static  native void native_ledClose() ;

    3、修改SystemServer.java

      在Slog.i(TAG,"Vibrator Service")下面添加:

      Slog.i(TAG,"Led Service");

      led = new LedService(context);

      ServiceManager.addService("led",led);

    4、实现com_android_server_LedService.cpp(JNI文件)(参考com_android_server_VibratorService.cpp),本例中没有实现HAL,其把HAL写到JNI中了,后面会来实现HAL

      里面注册本地方法,供LedService.java使用

      #define LOG_TAG "LedService"

      #include "jni.h"

      #include "JNIHelp.h"

      #include "android_runtime/AndroidRuntime.h"

      #include <utils/misc.h>

      #include <utils/Log.h>

      #include <hardware_legacy/vibrator.h>

      #include <stdio.h>

      //还有一些头问题

      namespace android

      {

      static jint fd;

      jint ledOpen(JNIEnv *env,jobject cls)

      {

        fd = open("/dev/leds",O_RDWR);

        ALOGI(“native ledOpen:%d”,fd);//打印

        if(fd >=0)

          return 0;

        else

          return -1;

      } 

      void ledClose(JNIEnv *env,jobject cls) 

      {

        close(fd);

      }  

      jint ledCtrl(JNIEnv *env,jobject cls,jint which,jint status)

      {

        int ret = ioctl(fd,status,which);

        return ret;

      }

      static const JNINativeMethod methods[] = {

        {"native_ledOpen","()I",(void *)ledOpen},

        {"native_ledClose","()V",(void *)ledClose},

        {"native_ledCtrl","(II)I",(void *)ledCtrl},

      };

      int register_android_server_LedService(JNIEnv *env)

      {

        return jniRegisterNativeMethods(env,"com/android/server/LedService",methods,NELEM(methods));

      }

      }

    5、修改Onload.cpp

      添加:register_android_server_LedService(env);并且还要声明,参考register_android_servier_VibratorService(env)

    上传各个文件:

    A、按照上面添加ILedService.aidl生成ILedService.java

    B、

    把修改的SystemServer.java和实现的LedService.java上传到:

    frameworks/base/services/java/com/android/server/SystemServer.java

    frameworks/base/services/core/java/com/android/server/LedServer.java

    不需要修改frameworks/base/services/core/Android.mk,其已经通过下面语句全部包含了:

    LOCAL_SRC_FILES +=

            $(call all-java_files_under,java)

    C、JNI:com_android_server_LedService.cpp和onload.cpp

     目录:frameworks/base/services/core/jni/onload.cpp

        frameworks/base/services/core/jni/com_android_server_LedService.cpp

     修改frameworks/base/services/core/jni/Android.mk,添加:

       $(LOCAL_REL_DIR)/com_android_server_LedService.cpp

    编译:

    mmm frameworks/base/services//修改的文件都在services下面,并且主要是servicess下的Android.mk把子目录下的Android.mk都一层一层包含了,同时也可以看到在services下的Android.mk里面把jni下的哪些cpp编译成了libandroid_servers,就是SystemServer.java中load的C库android_servers.so

    make snod//会生成system.img,但是在Android源码顶层目录下和out/target/product/tiny4412/下都有system.img,而且两个不一样

    ./gen-img.sh  //执行这个后,上面两个system.img一样了,如果不执行这句必须用out目录下的system.img

    设置为SD卡启动,使用miniTools烧写system.img之后,在设置为nand启动

    整体程序说明:

    A、SystemServer.java中的main函数调用new SystemServer().run()

    B、在run()函数中System.loadLibrary("android_servers")//加载C库,这个C库对应的文件就是Onload.cpp和我们实现的一大堆com_android_server_XXX.cpp(JNI文件)

    C、Onload.cpp里面有个JNI_Onload函数在库加载的时候被调用,其会调用JNI中提供的register_android_server_xxxService(env)来注册本地方法函数到服务类LedService,在LedService.java中可以看到起声明了和本地方法对应的函数

    D、SystemServer.java函数接着调用startOtherServices()函数来调用ServiceManager.addService(名字,服务类LedService对象)在注册,及告诉ServiceManager进程

    E、APP应用程序通过getService(名字)来获得Service

  • 相关阅读:
    用 Flask 来写个轻博客 (19) — 以 Bcrypt 密文存储账户信息与实现用户登陆表单
    用 Flask 来写个轻博客 (18) — 使用工厂模式来生成应用对象
    用 Flask 来写个轻博客 (18) — 使用工厂模式来生成应用对象
    用 Flask 来写个轻博客 (17) — MV(C)_应用蓝图来重构项目
    用 Flask 来写个轻博客 (17) — MV(C)_应用蓝图来重构项目
    Nginx详解八:Nginx基础篇之Nginx请求限制的配置语法与原理
    Nginx详解七:Nginx基础篇之Nginx官方模块
    Nginx详解六:Nginx基础篇之Nginx日志
    Nginx详解五:Nginx基础篇之HTTP请求
    Nginx详解四:Nginx基础篇之目录和配置语法
  • 原文地址:https://www.cnblogs.com/liusiluandzhangkun/p/9125003.html
Copyright © 2011-2022 走看看