TQ210搭载Android4.0.3系统构建之LED从驱动到HAL到JNI到应用程序(总结篇)

原帖地址:http://blog.csdn.net/undergrowth/article/details/9164409

 

本文是对前面驱动--HAL--JNI--APK的一个总结。

   

 

      上图即是整个流程的一个框架,上层APK通过JNI调用HAL层提供的接口,从而驱使硬件进行相应的操作。

      对于上图更为详细的解析:

     在APK层通过   

  1. static{  
  2.         System.loadLibrary("ledunders");    
  3.     }  

加载位于/system/lib/ 下的libledunders.so的动态共享库文件,在加载libledunders.so共享库时,首先运行JNI_OnLoad函数,主要做两件事 :

 1.((*vm)->GetEnv判断当前JVM是否支持JNI_VERSION_1_4这个版本

 2.register_native_led_method(env)注册本地函数

  1. jint JNI_OnLoad(JavaVM * vm, void * reserved)  //加载库时,第一个调用的函数  
  2. {  
  3.     JNIEnv *env=NULL;  //JNI函数的接口指针 pointer to the location where the JNI interface pointer for the current thread will be placed.  
  4.     jint result=-1;  
  5.     if((*vm)->GetEnv(vm,(void **)&env,JNI_VERSION_1_4)!=JNI_OK)  //判断JNI_VERSION_1_4这个版本是否支持  
  6.         {  
  7.             __android_log_print(ANDROID_LOG_DEBUG,"msg","JNI_VERSION_1_4 not supported.\n");  
  8.             return result;  
  9.         }  
  10.     if(register_native_led_method(env)!=0) //注册本地方法  
  11.         {  
  12.             __android_log_print(ANDROID_LOG_DEBUG,"msg","register native failed.\n");  
  13.             return result;  
  14.         }  
  15.     return JNI_VERSION_1_4;  
  16. }  



接下来通过APK层的led_init()本地函数调用JNI层的led_init函数

  1. if(!led_init())  //led初始化 加载库 初始化led 打开led  
  2.         {  
  3.             new AlertDialog.Builder(LedUnderActivity.this).setTitle("error").setMessage("init led fail\n").setPositiveButton("确定", null).show();  
  4.         }  


在JNI层的led_init函数中,通过hardware/libhardware/hardware.c的hw_get_module的方法使用ID找到在/system/lib/hw/下的led_unders.tq210.so文件,通过hardware/libhardware/hardware.c里面的load方法然后找到HMI符号,返回模块给module

  1. int err=hw_get_module(LED_UNDERS_HARDWARE_MODULE_ID, (const  hw_module_t **) &module);  

接着在JNI层使用led_control_open方法调用module->methods->open方法即HAL层中led_init函数初始化led_control_device_t结构体,打开/dev/led_unders设备文件,并返回给JNI层中的ledunderdevice

  1. if(led_control_open(&(module->common),&ledundersdevice)==0) return true;  
  1. static inline int led_control_open(struct hw_module_t *module,struct led_control_device_t **device)  
  2. {  
  3. //通过module的open方法找到device,并赋值给ledunderdevice  
  4.     int err=module->methods->open(module,LED_UNDERS_HARDWARE_MODULE_ID,(struct hw_device_t **)device);  
  5.     __android_log_print(ANDROID_LOG_DEBUG,"msg","led_control_open ,err=%d",err);  
  6.     return err;  
  7. }  


 

此时上层APK即可通过led_setOn/led_setOff来调用JNI层的led_setOn/led_setOff,然后调用HAL层的led_on/led_off,最终调用驱动层的gpio_led_under_ioctl来控制led灯

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值