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

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

 

开发板:TQ210

OS:Android 4.0.3

以下所有内容都是在TQ210开发板上实现,并且很多内容也是天嵌公司提供,我将一些内容进行了删减、替换,然后加入了一些自己的理解,同时也是记录自己学习的旅程。

 

led_unders_led_jni.c

  1. #include <jni.h>  //包含jint JNINativeMethod...  
  2. #include <android/log.h>  //包含__android_log_print...  
  3. #include <hardware/led_unders_led_hal.h>  
  4. #include <hardware/hardware.h>  
  5. #include <stdio.h>  
  6.   
  7. #define false      0  
  8. #define true        1  
  9.   
  10. #ifdef __cpulspuls  
  11. extern "C" {  //使用C语言的方式进行编译和连接  
  12. #endif  
  13.   
  14. static struct led_control_device_t *ledundersdevice=NULL;  //led设备指针  
  15.   
  16.   
  17. static inline int led_control_open(struct hw_module_t *module,struct led_control_device_t **device)  
  18. {  
  19. //通过module的open方法找到device,并赋值给ledunderdevice  
  20.     int err=module->methods->open(module,LED_UNDERS_HARDWARE_MODULE_ID,(struct hw_device_t **)device);  
  21.     __android_log_print(ANDROID_LOG_DEBUG,"msg","led_control_open ,err=%d",err);  
  22.     return err;  
  23. }  
  24.   
  25. static jboolean led_close(JNIEnv *env,jclass clazz)  //关闭设备  
  26. {  
  27.     if(ledundersdevice)  //关闭设备  
  28.         ledundersdevice->common.close(&(ledundersdevice->common));  
  29.     return 0;  
  30. }  
  31.   
  32. static jboolean led_setOn(JNIEnv *env,jclass clazz,jint number) //打开led  
  33. {  
  34.     if(ledundersdevice)  
  35.         return ledundersdevice->led_on(ledundersdevice,number);  
  36.     return false;  
  37. }  
  38.   
  39. static jboolean led_setOff(JNIEnv *env,jclass clazz,jint number) //关闭led  
  40. {  
  41.     if(ledundersdevice)  
  42.         return ledundersdevice->led_off(ledundersdevice,number);  
  43.     return false;  
  44. }  
  45.   
  46.   
  47.   
  48.   
  49. static jboolean led_init(JNIEnv *env,jclass clazz) //初始化本地函数  
  50. {  
  51.     struct led_module_t *module;  
  52.     //通过ID查找到模块  
  53.     int err=hw_get_module(LED_UNDERS_HARDWARE_MODULE_ID, (const  hw_module_t **) &module);  
  54.     if(err==0)  
  55.         {  
  56.         //通过module的common成员,找到设备指针并赋给ledunderdevice  
  57.             if(led_control_open(&(module->common),&ledundersdevice)==0) return true;  
  58.         }  
  59.     ledundersdevice=NULL;  
  60.     __android_log_print(ANDROID_LOG_DEBUG,"msg","led_init failed.\n");  
  61.     return false;  
  62. }  
  63.   
  64. static JNINativeMethod methods[]=  //方法数组  
  65. {  
  66.         {"led_init","()Z",(void *)led_init},  
  67.         {"led_setOn","(I)Z",(void *)led_setOn},  
  68.         {"led_setOff","(I)Z",(void *)led_setOff},  
  69.         {"led_close","()Z",(void *)led_close},  
  70. };  
  71.   
  72. jint register_native_led_method(JNIEnv *env) //注册本地方法  
  73. {  
  74.     static char *className="com/unders/led/LedUnderActivity"; //对应于上层应用的类的完整路径  
  75.     jclass clazz;  
  76.     clazz=(*env)->FindClass(env, className); //Returns a class object from a fully-qualified name, or NULL if the class cannot be found.  
  77.     if(clazz==NULL)  
  78.         {  
  79.             __android_log_print(ANDROID_LOG_DEBUG,"msg","can not find class %s",className);  
  80.             return -1;  
  81.         }  
  82.     if((*env)->RegisterNatives(env,clazz,methods, sizeof(methods)/sizeof(methods[0]))!=JNI_OK)  
  83.         {  
  84.             __android_log_print(ANDROID_LOG_DEBUG,"msg","can not register native.\n");  
  85.             return -1;  
  86.         }  
  87.     return 0;  
  88. }  
  89.   
  90.   
  91.   
  92. jint JNI_OnLoad(JavaVM * vm, void * reserved)  //加载库时,第一个调用的函数  
  93. {  
  94.     JNIEnv *env=NULL;  //JNI函数的接口指针 pointer to the location where the JNI interface pointer for the current thread will be placed.  
  95.     jint result=-1;  
  96.     if((*vm)->GetEnv(vm,(void **)&env,JNI_VERSION_1_4)!=JNI_OK)  //判断JNI_VERSION_1_4这个版本是否支持  
  97.         {  
  98.             __android_log_print(ANDROID_LOG_DEBUG,"msg","JNI_VERSION_1_4 not supported.\n");  
  99.             return result;  
  100.         }  
  101.     if(register_native_led_method(env)!=0) //注册本地方法  
  102.         {  
  103.             __android_log_print(ANDROID_LOG_DEBUG,"msg","register native failed.\n");  
  104.             return result;  
  105.         }  
  106.     return JNI_VERSION_1_4;  
  107. }  
  108.   
  109.   
  110.   
  111.   
  112.   
  113. #ifdef __cpulspuls  
  114. }  
  115. #endif  

 

Android.mk
  1. LOCAL_PATH  :=$(call my-dir)  
  2. include $(CLEAR_VARS)  
  3. LOCAL_PRELINK_MODULE    :=false  
  4. LOCAL_SRC_FILES :=led_unders_led_jni.c  
  5. LOCAL_SHARED_LIBRARIES  :=libutils \  
  6.     libhardware  
  7. LOCAL_MODULE    :=libledunders  
  8. LOCAL_MODULE_TAGS   :=optional  
  9. LOCAL_MODULE_PATH   :=$(LOCAL_PATH)  
  10. include $(BUILD_SHARED_LIBRARY)  


      Oracle JNI的官网 http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html

     在写JNI之前最好去上面的官网上 看看JNI的一些基本概念 比如JNI的接口函数、Invocation API。。。

    对于JNI,个人的理解,上层APK通过JNI访问HAL提供的接口,从而操纵驱动程序,驱动硬件。

 

  附:生成的libledunders.so文件放在/system/lib/目录下 apk在装载so文件时 会从该目录下查找匹配的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值