Android HAL实现3——基于Manager的HAL设计
来源:互联网 发布:python灰帽子下载 编辑:程序博客网 时间:2024/06/16 17:06
在上文中我们实现了利用Service来设计HAL,但是根据Android的框架,一般应用程序都不直接和Service打交到,中间需要经过一个Manager层
我们在这里也按照Android的框架,进一步优化HAL的设计。结构如下:
HAL stub <-> JNI 库 <-> JAVA Service<->Manager <-> JAVA 应用程序
由于 LedManager 和 LedService 属于两个进程,他们之间的通信需要通过AIDL来实现,
下面是ILedService.aidl
1. package mokoid.hardware;
2.
3. interface ILedService
4. {
5. booleansetOn(int led);
6. booleansetOff(int led);
7. }
在这个文件中定义了 LedService 提供给 LedManager 的接口,经过aidl工具会被编译成ILedService.java文件。
我们再看看LedManager是如何实现的:
1. public class LedManager
2. {
3. private static final String TAG = "LedManager";
4. private ILedService mLedService;
5.
6. public LedManager() {
7.
8. mLedService = ILedService.Stub.asInterface(
9. ServiceManager.getService("led"));
10.
11. if (mLedService != null) {
12. Log.i(TAG, "The LedManager object is ready.");
13. }
14. }
15.
16. public boolean LedOn(int n) {
17. boolean result = false;
18.
19. try {
20. result = mLedService.setOn(n);
21. } catch (RemoteException e) {
22. Log.e(TAG, "RemoteException in LedManager.LedOn:", e);
23. }
24. return result;
25. }
26.
27. public boolean LedOff(int n) {
28. boolean result = false;
29.
30. try {
31. result = mLedService.setOff(n);
32. } catch (RemoteException e) {
33. Log.e(TAG, "RemoteException in LedManager.LedOff:", e);
34. }
35. return result;
36. }
37. }
这里需要注意的是 mLedService = ILedService.Stub.asInterface(nager.getService("led"));
通过这个函数可以得到LedService的实例,从而调用它的方法。
而对于LedService我们需要作一个小小的改变,如下:
1. public final class LedService extends ILedService.Stub{
2.
3. static {
4. System.load("/system/lib/libmokoid_runtime.so");
5. }
6.
7. public LedService() {
8. Log.i("LedService", "Go to get LED Stub...");
9. _init();
10. }
11.
12. /*
13. * Mokoid LED native methods.
14. */
15. public boolean setOn(int led) {
16. Log.i("MokoidPlatform", "LED On");
17. return _set_on(led);
18. }
19.
20. public boolean setOff(int led) {
21. Log.i("MokoidPlatform", "LED Off");
22. return _set_off(led);
23. }
24.
25. private static native boolean _init();
26. private static native boolean _set_on(int led);
27. private static native boolean _set_off(int led);
28. }
该LedService需要继承自ILedService.Stub从而实现 AIDL接口 与 LedManager 通信。
=========================================================================
最后我们看看应用程序,在应用程序中,我们实现了一个service(注意和上面的service的区别)和一个activity,在service中start了LedService, 而在activity中通过LedManager来使用LedService中提供的接口。
我们首先来看看service的实现:
1. public class LedSystemServer extends Service {
2.
3. @Override
4. public IBinder onBind(Intent intent) {
5. return null;
6. }
7.
8. public void onStart(Intent intent, int startId) {
9. Log.i("LedSystemServer", "Start LedService...");
10.
11. /* Please also see SystemServer.java for your interests. */
12. LedService ls = new LedService();
13.
14. try {
15. ServiceManager.addService("led", ls);
16. } catch (RuntimeException e) {
17. Log.e("LedSystemServer", "Start LedService failed.");
18. }
19. }
20. }
这里需要注意的是ServiceManager.addService("led", ls); 通过它可以启动下面创建的LedService。
我们再看看Activity的实现:
1. public class LedTest extends Activity implements View.OnClickListener {
2. private LedManager mLedManager = null;
3.
4. @Override
5. public void onCreate(Bundle savedInstanceState) {
6. super.onCreate(savedInstanceState);
7.
8. // Start LedService in a seperated process.
9. startService(new Intent("com.mokoid.systemserver"));
10.
11. Button btn = new Button(this);
12. btn.setText("Click to turn LED 1 On");
13. btn.setOnClickListener(this);
14.
15. setContentView(btn);
16. }
17.
18. public void onClick(View v) {
19.
20. // Get LedManager.
21. if (mLedManager == null) {
22. Log.i("LedTest", "Creat a new LedManager object.");
23. mLedManager = new LedManager();
24. }
25.
26. if (mLedManager != null) {
27. Log.i("LedTest", "Got LedManager object.");
28. }
29.
30. /** Call methods in LedService via proxy object
31. * which is provided by LedManager.
32. */
33. mLedManager.LedOn(1);
34.
35. TextView tv = new TextView(this);
36. tv.setText("LED 1 is On.");
37. setContentView(tv);
38. }
39. }
当这个activity创建的时候,会通过intent开启上面定义的LedSystemServer,该LedSystemServer会开启前面定义的LedService,当点击button的时候,会new一个LedManager,该LedManager会通过ServiceManager.addService("led", ls)得到LedService的实例,并且提供LedService中的接口给这个activity使用,从而在该activity中实现对Led的控制。
本文出自 “Mobile and Linux Deve..” 博客,请务必保留此出处http://buaadallas.blog.51cto.com/399160/384919
- Android HAL实现3——基于Manager的HAL设计
- Android HAL实现的三种方式(3) - 基于Manager的HAL设计
- Android HAL实现的三种方式(3) - 基于Manager的HAL设计
- Android HAL实现的三种方式(3) - 基于Manager的HAL设计
- Android HAL实现的三种方式(3) - 基于Manager的HAL设计
- Android HAL实现的三种方式(3) - 基于Manager的HAL设计
- Android HAL实现2——基于Service的HAL设计
- Android HAL开发之基于Service的HAL设计
- android HAL开发之基于Service的HAL设计
- Android HAL实现的三种方式- 基于JNI的简单HAL设计
- Android HAL实现的三种方式(2) - 基于Service的HAL设计
- Android HAL实现的三种方式(2) - 基于Service的HAL设计
- Android HAL实现的三种方式(1) - 基于JNI的简单HAL设计
- Android HAL实现的三种方式(1) - 基于JNI的简单HAL设计
- Android HAL实现的三种方式(2) - 基于Service的HAL设计
- Android HAL实现的三种方式(1) - 基于JNI的简单HAL设计
- Android HAL实现的三种方式(2) - 基于Service的HAL设计
- Android HAL实现的三种方式(1) - 基于JNI的简单HAL设计
- 标准C++中的string类的用法总结
- 作为程序员,除了编程你还学到了什么?
- 使用嵌入式web服务器
- 学习小记--用C语言调用lua代码的Hello程序
- android 数据的四种存储方式 之 File
- Android HAL实现3——基于Manager的HAL设计
- Certificate chain 证书链
- Linux主要shell命令详解
- 用MyEclipse搭建SSH框架 Struts Spring Hibernate
- 汇编 BL BX
- input/output
- redis作者谈memcached
- Android技术积累:图片异步加载
- 讯飞语音,感受微信输入新体验