android平台led开发之框架层

三,框架层(framework)

   这里主要实现两部分

(1: 为Android HAL编写JNI方法,以便使得上层的APP能够使用下层提供的硬件服务

(2: 在Android系统的框架层提供Java接口的硬件服务

1,在frameworks/base/services/jni中新建com_android_server_swtled.cpp

点击(此处)折叠或打开

  1. #define LOG_TAG "SwtledService"
  2. #include "jni.h"
  3. #include "JNIHelp.h"
  4. #include "android_runtime/AndroidRuntime.h"
  5. #include <utils/misc.h>
  6. #include <utils/Log.h>
  7. #include <hardware/hardware.h>
  8. #include <hardware/swtled.h>
  9. #include <stdio.h>



  10. namespace android
  11. {
  12.     struct swtled_device_t* swtled_device = NULL;


  13.     static void swtled_set_on(JNIEnv* env, jobject clazz,jint number)
  14.     {
  15.         int num = number;
  16.         LOGI("Swtled JNI: select lighton is %d",num);

  17.         if (!swtled_device)
  18.         {
  19.             LOGI("Swtled JNI:device is not open.");
  20.             return;
  21.         }
  22.         swtled_device->set_on(swtled_device,num);
  23.     }

  24.     static void swtled_set_off(JNIEnv* env, jobject clazz,jint number)
  25.     {
  26.          
  27.         int num = number;
  28.         LOGI("Swtled JNI: select lightoff is %d",num);

  29.         if (!swtled_device)
  30.         {
  31.             LOGI("Swtled JNI:device is not open.");
  32.             return;
  33.         }
  34.         swtled_device->set_off(swtled_device,num);
  35.     }

  36.     static inline int swtled_device_open(hw_module_t* module,swtled_device_t** device)
  37.     {
  38.         return module->methods->open(module,SWTLED_HARDWARE_MODULE_ID,(hw_device_t**)device);
  39.     }
  40.     

  41.     static jboolean swtled_init(JNIEnv* env,jclass clazz)
  42.     {
  43.         swtled_module_t* swtledmodule;
  44.         
  45.         LOGI("Swtled JNI: initializing...");

  46.         if (hw_get_module(SWTLED_HARDWARE_MODULE_ID,(const struct hw_module_t**)&swtledmodule)==0)
  47.         {
  48.             LOGI("Swtled JNI: swtled stub be found.");
  49.             if (swtled_device_open(&(swtledmodule->common),&swtled_device)== 0)
  50.             {
  51.                 LOGI("Swtled JNI: swtled device open successful.");
  52.                 return 0;
  53.             }

  54.             LOGI("Swtled JNI: failed to open swtled device.");
  55.             return -1;
  56.         }
  57.         
  58.         LOGI("Swtled JNI: failed to get swtled stub module.");
  59.         return -1;
  60.      }
  61.     
  62.      static const JNINativeMethod method_table[]=
  63.      {
  64.         {"init_native","()Z",(void*)swtled_init},
  65.         {"setOn_native","(I)V",(void*)swtled_set_on},
  66.         {"setOff_native","(I)V",(void*)swtled_set_off},
  67.      };

  68.     int register_android_server_SwtledService(JNIEnv* env)
  69.     {
  70.         return jniRegisterNativeMethods(env,"com/android/server/SwtledService",method_table,NELEM(method_table));
  71.     }
  72. }

修改同级目录下的Android.mk和Onload.cpp文件

在Android.mk的LOCAL_SRC_FILES:=下添加

点击(此处)折叠或打开

  1. LOCAL_SRC_FILES:=\
  2. ....
  3. com_android_server_swtled.cpp \

在Onload.cpp中的namespace android {  下加入

点击(此处)折叠或打开

  1. int register_android_server_SwtledService(JNIEnv* env);

同时在JNI_OnLoad函数下加入

点击(此处)折叠或打开

  1. register_android_server_SwtledService(env);


2,编译

   (1,执行mmm framework/base/services/jni

   (2,make snod

3,在frameworks/base/core/java/android/os 新建ISwtledService.aidl,代码如下

点击(此处)折叠或打开

  1. package android.os;



  2. interface ISwtledService {

  3.     void setOn(intnumber);

  4.     void setOff(intnumber);

  5. }
返回到frameworks/base目录,打开Android.mk文件,修改LOCAL_SRC_FILES变量的值,增加ISwtledService.aidl源文件

点击(此处)折叠或打开

  1. LOCAL_SRC_FILES += /
  2. ....................................................................
  3. core/java/android/os/IVibratorService.aidl /
  4. core/java/android/os/ISwtledService.aidl /
  5. core/java/android/service/urlrenderer/IUrlRendererService.aidl /
4,编译ISwtledService接口
  mmm framework/base,如果正确,那么会根据ISwtledService.aidl生成对应的ISwtledService.Stub接口
 
5, 进入到frameworks/base/services/java/com/android/server目录,新增ISwtledService.java文件:


点击(此处)折叠或打开

  1. package com.android.server;
  2. import android.content.Context;
  3. import android.os.ISwtledService;
  4. import android.util.Slog;


  5. public class SwtledServiceextends ISwtledService.Stub{

  6.     private staticfinalString TAG= "SwtledService";

  7.     SwtledService()
  8.     {
  9.         init_native();
  10.     }

  11.     public void setOn(intnumber)
  12.     {
  13.         setOn_native(number);
  14.     }

  15.     public void setOff(intnumber)
  16.     {
  17.         setOff_native(number);
  18.     }

  19.     private staticnativeboolean init_native();
  20.     private staticnativevoid setOn_native(intnumber);
  21.     private staticnativevoid setOff_native(intnumber);
  22. };
6,修改同目录下的SystemServer.java文件,在ServerThread::run方法里加入

点击(此处)折叠或打开

  1. try{
  2.                  
  3.                 Slog.i(TAG,"Swtled Service");
  4.                 ServiceManager.addService("swtled",new SwtledService());
  5.             } catch(Throwable e){
  6.                 Slog.e(TAG,"Failure starting Swtled Service", e);
  7.             }
7,编译SwtledService.java并打包进system.img
   (1)mmm framework/base/services/java
   (2)make snod
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值