Android硬件访问服务框架代码编写
2016-05-13 18:37
676 查看
思路从最上层调用到底层编写,流程如下:
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即可。
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即可。
相关文章推荐
- android获取当前系统时间,同时比较当前时间是否在一个时间段范围内
- Xamarin.Android 反复报 Please Download android_m2repository_rxx.zip 的解决办法
- Android开发小知识
- Android 开发之SQLITE 数据库的使用
- Android中的文件存储和sharedpreference
- 【Android】联想到onNewIntent()在手机QQ上的用法
- android开发一些好用的小知识
- android WebView拦截js弹窗界面无响应问题
- Android-Activity生命周期的理解
- Android Matrix手势缩放自定义view 不止于Imageview
- Android中EditText隐藏/自动弹出输入法的问题
- Android的udp回显测试源码
- Android 自定义注解框架
- Android SDK 国内镜像
- android测试框架对比(二)
- android BroadCast的发送与接收
- Android中intent传递list或者对象的方法
- Android Studio NDK 开发配置
- android 使用fastjson解析
- 玩转Android studio 插件开发、测试、JCenter库发布(1)