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

6.2、Android硬件访问服务编写系统代码的更多相关文章

  1. 2.Android硬件访问服务编写系统代码【转】

    本文转载自:https://blog.csdn.net/qq_33443989/article/details/76696772 版权声明:本文为博主(Tower)自学笔记,欢迎转载! :-)     ...

  2. 6.4 Android硬件访问服务编写HAL代码

    JNI向上提供本地函数,向下加载HAL文件,并调用HAL的函数: HAL负责访问驱动程序执行硬件操作 JNI和HAL都是用c语言或者C++语言编写的,JNI加载HAL的实质就是使用dlopen加载动态 ...

  3. 6.1、Android硬件访问服务之框架

    1.通过前面led点亮的例子,其流程如下 Android app(java)(通过loadLibrary)——>C library(C库做如下事情)——>1.JNI_Onload 2.jn ...

  4. 6.5 Android硬件访问服务使用反射

    1.前面的例子中App为了能够范问ILedService接口,把classes.jar导入到应用程序中,但是我们不想把classes编进apk包里面去,这样导致我们的apk程序会很大(解压缩apk会发 ...

  5. Android硬件访问服务中的HAL-查看打印的信息

    JNI  向上提供本地函数,向下加载HAL文件并调用HAL的函数 HAL 负责访问驱动程序执行硬件操作. external\chromium_org\third_party\hwcplus\src\h ...

  6. 6.3 Android硬件访问服务APP代码

    以下步骤是操作MainActivity类 1.导入包 import android.os.ILedService 2.添加成员变量 private ILedService iLedService = ...

  7. 硬件访问服务学习笔记_WDS

    1.Android驱动框架App1 App2 App3 App4-------------------硬件访问服务-------------------JNI-------------------C库 ...

  8. LED硬件访问服务(2)——JNI/HAL

    一.系统编程 1.SystemServer.java类中提供了main()方法,说明它是以一个进程的方式存在的,启动后直接执行其run() 2.注册服务ServiceManager.addServic ...

  9. 在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务(老罗学习笔记5)

    在数字科技日新月异的今天,软件和硬件的完美结合,造就了智能移动设备的流行.今天大家对iOS和Android系统的趋之若鹜,一定程度上是由于这两个系统上有着丰富多彩的各种应用软件.因此,软件和硬件的关系 ...

随机推荐

  1. js插件---tree(多级文件)插件如何使用

    js插件---tree(多级文件)插件如何使用 一.总结 一句话总结:还是一般的引入js和css后js调用的方式, 只不过tree调用的时候必须设置一个 HTML 模板(就是调用的那段html代码,别 ...

  2. 戏说Linux商用数据库

    戏说Linux商用数据库 上一篇文章(http://chenguang.blog.51cto.com/350944/277533)我介绍了Linux下几款开源数据库Mysql,MaxDB.Postgr ...

  3. javafx tabPane

    public class EffectTest extends Application { @Override public void start(Stage primaryStage) { prim ...

  4. C语言编程入门——程序练习(下)

    C语言的一些简单操作练习. 互换两个数字: # include <stdio.h> int main(void) { int i = 3; int j = 5; int t;   //将i ...

  5. CSS控制显示超出部分,用省略号显示

    经常使用.可是常忘,我又不是写css的.所以记下来: 先设置一下限制的宽度, display:block; white-space:nowrap; overflow:hidden; text-over ...

  6. php中this,self,parent三个关键字的区别辨析

    php中this,self,parent三个关键字的区别辨析 一.总结 一句话总结:this是指向对象实例的一个指针,self是对类本身的一个引用,parent是对父类的引用. 1.self关键字使用 ...

  7. thinkphp多层volist实现多表查询

    thinkphp多层volist实现多表查询 一.总结 二.截图 三.代码 1.控制器 2.视图

  8. 63.当当网txt数据按行切割与合并

    获取文件有多少行 //获取文件有多少行 int getN(char *path) { FILE *pf = fopen(path, "r"); if (pf==NULL) { ; ...

  9. Pairs Forming LCM

    题目: B - Pairs Forming LCM Time Limit:2000MS     Memory Limit:32768KB Description Find the result of ...

  10. 洛谷——U10783 名字被和谐了

    https://www.luogu.org/problem/show?pid=U10783 题目背景 众所周知,我们称g是a的约数,当且仅当g是正数且a mod g = 0. 众所周知,若g既是a的约 ...