Android硬件访问服务框架代码编写

思路从最上层调用到底层编写,流程如下:

1 实现与APP直接对接的操作硬件的接口,这个最简单。
只需要实现AIDL文件(Android Interface Define Language),其目的是让安卓系统自动帮我们实现对应用JAVA接口文件。

PS:可以搜索源码中的例子比如:IVibrator.aidl,修改成如下代码:

package.android.os

Interface ILedService
{
        int ledctrl(int which, int status);
}

1 上传AIDL文件 
将AIDL文件上传编译之前,需要先编译整个安卓源码(目前编译4412开发板)。编译完后上传到目录中,But,哪个目录?
模仿其它AIDL文件在哪个目录,然后上传到相应的目录。
/android-5.0.2/frameworkds/base/core/java/android/os目录下

2 修改/android-5.0.2/frameworkds/base/下的Android.mk文件:
增加一行:
core/java/android/os/ILedService.aidl\

3 输入mmm ./回车编译当前目录

4 编译的结果放在/android-5.0.2/out/下
find -name "ILedService.java"

5 ILedService.java这个文件接口如何使用。
先获取Service,然后将其转换为接口对象,然后调用这个接口对象的成员方法。

总结:
1 编写ILedService.aidl文件 ==>编译生成ILedService.java文件
2 app使用:ILedService   iLedService;
                   iLedService = ILedService.Stub.asInterface(ServiceManager.getService("Led"))
   调用:iLedService.ledctrl(0, 1);
所以用户APP层调用iLedService接口,但是这个接口并不直接操作硬件,操作硬件的是LedService.java,下面描述这个LedService.java程序怎么编写。注意,这个LedService.java的作用是调用本地Native方法来操作硬件。
以下是源码:

 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 ) throw  //要实现ILedService内的接口就是这个。
    {
        return native_ledCtrl(which, status);
    }
   
    //in struct method call ledOpen()
    public LedService ()
    {
        native_ledOpen();
    }
    //declare native local methods.
    public static native  int native_ledCtrl(int which, int status );
    public static native  int native_ledOpen();
    public static native  void native_ledClose();
}

现在已经把LedService.java文件写好了,但是需要把它的这项服务告诉给SystemServer.java,故需要在SystemServer.java中添加这项服务,这里称之为addService. 方法如下:

Slog.i(TAG, "LedService"); 
ServiceManager.addService("Led",  new LedService()); //添加服务接口

总结:编写好应用层接口的LedService.java文件后,需要在SystemServer.java修改,添加服务:
          ServiceManager.addService("Led", new LedService());
以上工作完成后,后面就需要实现注册Native本地方法(如下文件),即编写驱动的JNI封装,供LedService.java调用。

com.android.Server.LedService.cpp:


#define LOG_TAG "LedService"

#include "jni.h"
#include "JNIHep.h"
#include "androd_runtime/AndroidRuntime.h"

namespace android
{
int register_android_server_LedService(JNIEnv *..)
{
    return jniRegisterNativeMethods(env,"comm/android/server/LedService",
       method_table, NELEM(method_table));
}

}

。。。(后面就是之前写过的JNI程序)

还要修改onload.cpp,在里面调用注册方法,如下:
register_android_server_LedService(env);
然后修改其Android.mk,并编译。
编译方法如下:
$ mmm frameworks/base/services (由于有不同层的文件有变化,找最上一层的)
$ make snod (生成镜像文件) ==》生成out/target/product/tiny4412/system.img,后面只需要将这个镜像文件烧入开发板即可
$ ./gen-img.sh: 在此目录下(work/android-5.0.2/下)生成镜像文件(与out/.../system.img是一样的),此脚本还可以生成userdata.img。

后面用minitool工作烧写安卓system.img即可。

猜你喜欢

转载自blog.csdn.net/ab198604/article/details/51397586
今日推荐