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即可。 | |
python如何操作Sql Server 2008 最近由于公司的一个项目需要,需要使用Sql Server 2008数据库,开 ...
linux内核如何管理进程 “进程”有诸多的定义,在许多的教材资料上,其定义是一个程序的执行实例, ...