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

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

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

#include "jni.h"
#include "JNIHelp.h"
#include "android_runtime/AndroidRuntime.h"
#include <utils/misc.h>
#include <utils/Log.h>
#include <hardware/hardware.h>
#include <hardware/gpio.h>
#include <stdio.h>
namespace android
{
struct gpio_device_t* gpio_device = NULL; static void gpio_setVal(JNIEnv* env, jobject clazz, jint value)
{
int val = value;
gpio_device->set_val(gpio_device, val);
} static jint gpio_getVal(JNIEnv* env, jobject clazz)
{
return 0;
} static inline int gpio_device_open(const hw_module_t* module, struct gpio_device_t** device)
{
return module->methods->open(module, GPIO_HARDWARE_MODULE_ID, (struct hw_device_t**)device);
} static jboolean gpio_init(JNIEnv* env, jclass clazz)
{
gpio_module_t* module;
if(hw_get_module(GPIO_HARDWARE_MODULE_ID, (const struct hw_module_t**)&module) == 0)
{
if(gpio_device_open(&(module->common), &gpio_device) == 0)
{
return 0;
}
return -1;
}
return -1;
} static const JNINativeMethod method_table[] =
{
{"init_native", "()Z", (void*)gpio_init},
{"setVal_native", "(I)V", (void*)gpio_setVal},
{"getVal_native", "()I", (void*)gpio_getVal},
}; int register_android_server_GpioService(JNIEnv *env) {
return jniRegisterNativeMethods(env, "com/android/server/GpioService", method_table, NELEM(method_table));
}
};

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

在namespace android中增加函数声明:

int register_android_server_GpioService(JNIEnv* env);

在JNI_Onload中增加函数调用:

register_android_server_GpioService(env);

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

extern int register_android_server_GpioService(JNIEnv* env);

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

在LOCAL_SRC_FILES增加:

com_android_server_GpioService.cpp \

编译JNI方法:

make TARGET_PRODUCT=am335xevm_sk -j8 OMAPES=4.x

假设成功,则生成libandroid_servers.so

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. [React Native] Animate the Scale of a React Native Button using Animated.spring

    In this lesson we will use Animated.spring and TouchableWithoutFeedback to animate the scale of a bu ...

  2. ubuntu终端sudo java提示“command not found”解决办法

    我在ubuntu 12.04里想启动一个java程序,sudo java -jar xxx.jar,但是结果提示sudo:java:command not found. Ubuntu下用sudo运行j ...

  3. 搜索 debian8.7.1 ,google vs baidu

    国外的 Linux 比国内流行, debian官方网站只能找到当前版本DVD文件.想找旧版的Debian在百度一圈后徒劳无功,于是把目标转向 google ,只需要输入 debian?8.7.1-i3 ...

  4. worktools-源码下拉问题

    今天下拉源码的时候,出现了一个问题,就是当地的内容跟仓库的内容冲突,导致merge冲突.这时候CC指令不能用.然后希望通过checkout到其他分支,然后cc掉的.结果没办法切换到其他分支,一直停留在 ...

  5. SQL中实现千分位的语句

    传递一个sql的小知识,现成的语句,在工作流的表单域中很实用. 数字或字符串转成千分位 ) 字符串转换成数值 )

  6. HDU——T 2824 The Euler function

    http://acm.hdu.edu.cn/showproblem.php?pid=2824 Time Limit: 2000/1000 MS (Java/Others)    Memory Limi ...

  7. 【Oracle错误集锦】:PLSQL无法直连64位Oracle11g数据库

    背景:Oracle数据库装在本机上,使用PLSQL连接. 今天安装完Oracle 11g数据库后.用plsql连接数据库死活都连接不上.而且plsql客户端登录窗体的Database下拉框还为空.见下 ...

  8. 深度学习 Deep Learning UFLDL 最新Tutorial 学习笔记 3:Vectorization

    1 Vectorization 简述 Vectorization 翻译过来就是向量化,各简单的理解就是实现矩阵计算. 为什么MATLAB叫MATLAB?大概就是Matrix Lab,最根本的差别于其它 ...

  9. RocketMQ集群消费的那些事

    说明 RocketMQ集群消费的时候,我们经常看到类似注释里面 (1,(2 的写法,已经有时候有同学没注意抛异常的情况就是(3 模拟的情况.那么这3种情况到底是怎么样的呢?你是否都了然于心呢?下面我们 ...

  10. c++中的相对路径

           今天在vs2010里读取相对路径下的图片文件出了点问题.于是查了一下相对路径的编程知识,记录下来分享给大家:      问题描写叙述:path=".\\TrainData\\& ...