Android 从硬件到应用:一步一步向上爬 4 -- 使用 JNI 方法调硬件驱动
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 方法调硬件驱动的更多相关文章
- Android 从硬件到应用程序:一步一步爬上去 6 -- 我写的APP测试框架层硬件服务(终点)
创Android Applicationproject:采用Eclipse的Android插入ADT创Androidproject,project名字Gpio,创建完成后,project文件夹pack ...
- 一步一步了解Cocos2dx 3.0 正式版本开发环境搭建(Win32/Android)
cocos2d-x 3.0发布有一段时间了,作为一个初学者,我一直觉得cocos2d-x很坑.每个比较大的版本变动,都会有不一样的项目创建方式,每次的跨度都挺大…… 但是凭心而论,3.0RC版本开始 ...
- 在Ubuntu为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口(老罗学习笔记4)
在上两篇文章中,我们介绍了如何为Android系统的硬件编写驱动程序,包括如何在Linux内核空间实现内核驱动程序和在用户空间实现硬件抽象层接口.实现这两者的目的是为了向更上一层提供硬件访问接口,即为 ...
- 一步一步学android控件(之十五) —— DegitalClock & AnalogClock
原本计划DigitalClock和AnalogClock单独各一篇来写,但是想想,两个控件的作用都一样,就和在一起写一篇了. DegitalClock和AnalogClock控件主要用于显示当前时间信 ...
- 一步一步学android控件(之十六)—— CheckBox
根据使用场景不同,有时候使用系统默认的CheckBox样式就可以了,但是有时候就需要自定义CheckBox的样式.今天主要学习如何自定义CheckBox样式.在CheckBox状态改变时有时需要做一些 ...
- 为Android硬件抽象层(HAL)模块编写JNI方法提供Java访问硬件服务接口
在上两篇文章中,我们介绍了如何为Android系统的硬件编写驱动程序,包括如何在Linux内核空间实现内核驱动程序和在用户空间实现硬件抽象层接 口.实现这两者的目的是为了向更上一层提供硬件访问接口,即 ...
- 一步一步学android控件(之六) —— MultiAutoCompleteTextView
今天学习的控件是MultiAutoCompleteTextView . 提到MultiAutoCompleteTextView 我们就自然而然地想到AutoCompleteTextView ,就想知道 ...
- Ace教你一步一步做Android新闻客户端(一)
复制粘贴了那么多博文很不好意思没点自己原创的也说不出去,现在写一篇一步一步教你做安卓新闻客户端,借此机会也是让自己把相关的技术再复习一遍,大神莫笑,专门做给新手看. 手里存了两篇,一个包括软件视图 和 ...
- android一步一步实现视频clientapp(一)
我开发完毕了一个完整的视频clientapp.如今.分享出来.供刚開始学习的人学习參考(大神就不用看了,比較简单,仅供入门),大家相互交流相互学习. 项目有些功能,我时间也不是非常多.仅仅能时不时更新 ...
随机推荐
- 源代码编译安装CloudStack 4.2
基于CentOS 6.4安装CloudStack 环境配置 # yum -y update # yum -y upgrade 安装NTP,jdk 1.7, tomcat 6, mysql,git等服务 ...
- VPS 上线监控监控脚本
文件地址 https://github.com/yourshell/yisuo-script/blob/master/vpstz/vpsmon.zip https://download.csdn.ne ...
- 有關AWS EC2 (EBS 收費)的問題
有關AWS EC2 (EBS 收費)的問題 之前一陣子的時候,公司在使用Amazone Web Service (AWS)的 EC2 (Amazon Elastic Compute Cloud).不過 ...
- Fedora 10下应用网络模拟器NS心得
650) this.width=650;" onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" ...
- int android.support.v7.widget.RecyclerView$ViewHolder.mItemViewType' on a null.....
Android.support.v7.widget.RecyclerView$ViewHolder.mItemViewType' on a null..空指针问题,费劲心思才找到报空指针的原因: 代码 ...
- Linux中iptables学习
防火墙:是一种位于内部网络与外部网络之间安全的防护系统,依照特定的规则,允许或是限制传输的数据通过.iptables通常被用作类UNIX系统中的防火墙,更准确的说,可以称为iptables/netfi ...
- Nginx配置GZIP
记录一次解决网站加载慢的问题 一. nginx配置 gzip on;gzip_min_length 1k;gzip_buffers 4 16k;gzip_http_version 1.1;g ...
- 【Educational Codeforces Round 33 B】Beautiful Divisors
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 把所有的那些数字打表出来. 逆序枚举就好 [代码] /* 1.Shoud it use long long ? 2.Have you ...
- jdk目录详解及其使用方法
jdk目录详解 jdk目录详解 JDK(Java Development Kit,Java开发包,Java开发工具)是一个写Java的applet和应用程序的程序开发环境.它由一个处于操作系统层之上的 ...
- Wicket实战(二)hello world
上次的博文Wicket实战(一)概述中给大家简介了一下关于Wicket的概念性内容,今天我们完毕第一个Wicket实例-Hello World! 1.Hello World原版 在Wic ...