Android下,java应用程序通过JNI方法调用硬件抽象层模块,在Android 从硬件到应用:一步一步向上爬 3 -- 硬件抽象层訪问硬件驱动

中我们已经编译好了硬件抽象层模块,以下就要開始为HAL层编写JNI方法,为上层提供服务。

cd到frameworks/base/services/jni文件夹中,新建一个com_android_server_GpioService.cpp文件:

  1. #include "jni.h"
  2. #include "JNIHelp.h"
  3. #include "android_runtime/AndroidRuntime.h"
  4. #include <utils/misc.h>
  5. #include <utils/Log.h>
  6. #include <hardware/hardware.h>
  7. #include <hardware/gpio.h>
  8. #include <stdio.h>
  9. namespace android
  10. {
  11. struct gpio_device_t* gpio_device = NULL;
  12.  
  13. static void gpio_setVal(JNIEnv* env, jobject clazz, jint value)
  14. {
  15. int val = value;
  16. gpio_device->set_val(gpio_device, val);
  17. }
  18.  
  19. static jint gpio_getVal(JNIEnv* env, jobject clazz)
  20. {
  21. return 0;
  22. }
  23.  
  24. static inline int gpio_device_open(const hw_module_t* module, struct gpio_device_t** device)
  25. {
  26. return module->methods->open(module, GPIO_HARDWARE_MODULE_ID, (struct hw_device_t**)device);
  27. }
  28.  
  29. static jboolean gpio_init(JNIEnv* env, jclass clazz)
  30. {
  31. gpio_module_t* module;
  32. if(hw_get_module(GPIO_HARDWARE_MODULE_ID, (const struct hw_module_t**)&module) == 0)
  33. {
  34. if(gpio_device_open(&(module->common), &gpio_device) == 0)
  35. {
  36. return 0;
  37. }
  38. return -1;
  39. }
  40. return -1;
  41. }
  42.  
  43. static const JNINativeMethod method_table[] =
  44. {
  45. {"init_native", "()Z", (void*)gpio_init},
  46. {"setVal_native", "(I)V", (void*)gpio_setVal},
  47. {"getVal_native", "()I", (void*)gpio_getVal},
  48. };
  49.  
  50. int register_android_server_GpioService(JNIEnv *env) {
  51. return jniRegisterNativeMethods(env, "com/android/server/GpioService", method_table, NELEM(method_table));
  52. }
  53. };

当中GPIO_HARDWARE_MODULE_ID是在hardware/gpio.h中定义的,初始化时通过hw_get_module方法载入硬件层模块。 改动当前文件夹下的onload.cpp:

在namespace android中增加函数声明:

  1. int register_android_server_GpioService(JNIEnv* env);

在JNI_Onload中增加函数调用:

  1. register_android_server_GpioService(env);

改动frameworks/base/core/jni下的AndroidRuntime.cpp,在namespace android中增加声明:

  1. extern int register_android_server_GpioService(JNIEnv* env);

改动services/jni文件夹下的Android.mk文件:

在LOCAL_SRC_FILES增加:

  1. com_android_server_GpioService.cpp \

编译JNI方法:

  1. make TARGET_PRODUCT=am335xevm_sk -j8 OMAPES=4.x

假设成功,则生成libandroid_servers.so

  1. out/target/product/am335xevm_sk/obj/lib/libandroid_servers.so

JNI方法编译完毕后,就能够通过android硬件服务GpioService来调用JNI方法,以此来调用硬件抽象层訪问底层硬件。

Android 从硬件到应用:一步一步向上爬 4 -- 使用 JNI 方法调硬件驱动的更多相关文章

  1. Android 从硬件到应用程序:一步一步爬上去 6 -- 我写的APP测试框架层硬件服务(终点)

    创Android Applicationproject:采用Eclipse的Android插入ADT创Androidproject,project名字Gpio,创建完成后,project文件夹pack ...

  2. 一步一步了解Cocos2dx 3.0 正式版本开发环境搭建(Win32/Android)

    cocos2d-x 3.0发布有一段时间了,作为一个初学者,我一直觉得cocos2d-x很坑.每个比较大的版本变动,都会有不一样的项目创建方式,每次的跨度都挺大…… 但是凭心而论,3.0RC版本开始 ...

  3. 在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口(老罗学习笔记4)

    在上两篇文章中,我们介绍了如何为Android系统的硬件编写驱动程序,包括如何在Linux内核空间实现内核驱动程序和在用户空间实现硬件抽象层接口.实现这两者的目的是为了向更上一层提供硬件访问接口,即为 ...

  4. 一步一步学android控件(之十五) —— DegitalClock & AnalogClock

    原本计划DigitalClock和AnalogClock单独各一篇来写,但是想想,两个控件的作用都一样,就和在一起写一篇了. DegitalClock和AnalogClock控件主要用于显示当前时间信 ...

  5. 一步一步学android控件(之十六)—— CheckBox

    根据使用场景不同,有时候使用系统默认的CheckBox样式就可以了,但是有时候就需要自定义CheckBox的样式.今天主要学习如何自定义CheckBox样式.在CheckBox状态改变时有时需要做一些 ...

  6. 为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口

    在上两篇文章中,我们介绍了如何为Android系统的硬件编写驱动程序,包括如何在Linux内核空间实现内核驱动程序和在用户空间实现硬件抽象层接 口.实现这两者的目的是为了向更上一层提供硬件访问接口,即 ...

  7. 一步一步学android控件(之六) —— MultiAutoCompleteTextView

    今天学习的控件是MultiAutoCompleteTextView . 提到MultiAutoCompleteTextView 我们就自然而然地想到AutoCompleteTextView ,就想知道 ...

  8. Ace教你一步一步做Android新闻客户端(一)

    复制粘贴了那么多博文很不好意思没点自己原创的也说不出去,现在写一篇一步一步教你做安卓新闻客户端,借此机会也是让自己把相关的技术再复习一遍,大神莫笑,专门做给新手看. 手里存了两篇,一个包括软件视图 和 ...

  9. android一步一步实现视频clientapp(一)

    我开发完毕了一个完整的视频clientapp.如今.分享出来.供刚開始学习的人学习參考(大神就不用看了,比較简单,仅供入门),大家相互交流相互学习. 项目有些功能,我时间也不是非常多.仅仅能时不时更新 ...

随机推荐

  1. Ajax : load()

    <body> <input type="button" value="Ajax" /> <div id="box&quo ...

  2. go pointer

    go pointer package main import "fmt" type Mutatable struct { a int b int } func (m Mutatab ...

  3. Win8.1恢复这台电脑里的6个文件夹

    平台:win8.1 问题:网络下载的ghost版8.1,装好后“这台电脑”里没有6个常用的文件夹. 解决:导入下列注册表项即可 Windows Registry Editor Version 5.00 ...

  4. 记阮一峰---JavaScript 标准参考教程之标准库-Object对象

    在看到阮大神的-标准库-Object对象时 有个 类型判断类型 方法可能以后会用到.特此记录一下 4.3:toString()的应用:判断数据类型 Object.prototype.toString方 ...

  5. CORS原理

    http://blog.csdn.net/renfufei/article/details/51675148 https://html.spec.whatwg.org/multipage/infras ...

  6. [Phonegap+Sencha Touch] 移动开发76 让cordova app訪问远端站点也能调用cordova插件功能

    原文链接:http://blog.csdn.net/lovelyelfpop/article/details/50735395 我相信.应该会有一些cordova开发人员想过实现以下这种app: 使用 ...

  7. 1.html+css页面设计

    转自:http://www.cnblogs.com/ywang/archive/2014/04/16/3668638.html 今天用html+css做一个最简单的页面.效果图如下: 说明:这里的韩文 ...

  8. Android Service com.android.exchange.ExchangeService has leaked ServiceConnection

    启动Android项目的时候,clean  Project的时候,报错: android.app.ServiceConnectionLeaked: Service com.android.exchan ...

  9. 防止登录页面出如今frame中

    在使用frame页面嵌套开发的时候,遇到重新启动了server的时候会出现登录页面在frame页面中出现, 所以须要在登录页面里面用js推断下当前的地址信息,然后跳转到登录的单独页面中. js代码例如 ...

  10. 黑马day01 xml 的解析方式

    XML编程:利用java程序去增删改查(CRUD)xml中的数据 解析思想: dom解析 sax解析 基于这两种解析思想市面上就有了非常多的解析api sun jaxp既有dom方式也有sax方式,而 ...