Android驱动入门-LED--HAL硬件访问服务层②
硬件平台: FriendlyARM Tiny4412 Cortex-A9
操作系统: UBUNTU 14.04 LTS
时间:2016-09-21 16:58:56
为了避免访问冲突,则创建了硬件访问服务层。
硬件服务需要注册到service manager。
首先:内核驱动 <<-->> LED-HAL硬件抽象层 <<-->> CPP文件 <<-->> 服务类JAVA。
服务类JAVA包含: aidl 、硬件服务 、注册到ServerManger。
首先编写aidl文件。
在 Android-5.0.2/frameworks/base/core/java/android/os/ 下创建接口文件 ILedServiece.aidl 以Vibrator为基准。
package android.os;
/** {@hide} */
interface ILedService //下面的函数为我们需要的接口函数。
{
int LedOpen();
int LedOn( int no );
int LedOff( int no );
}
为了转化到java文件 则修改mk文件。
在 Android-5.0.2/frameworks/base/Android.mk文件中 添加 core/java/android/os/ILedService.aidl \
开始编译
. setenv //配置环境变量
lunch
mmm frameworks/base //编译
编译完成后会自动生成文件JAVA文件: out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/os/ILedService.java
创建服务类: 在frameworks/base/services/core/java/com/android/server/目录下。
以Vibrator为基准。创建 LedService.java
package com.android.server; import android.util.Slog;
import android.os.ILedService; //来自自动生成的文件 public class LedService extends ILedService.Stub {
private static final String TAG = "LedService"; public int LedOpen() throws android.os.RemoteException //此函数名是从自动生成的java文件ILedService.java中拷贝而来的
{
return native_LedOpen();
} public int LedOn(int no) throws android.os.RemoteException //此函数名是从自动生成的java文件ILedService.java中拷贝而来的
{
return native_LedOn( no );
} public int LedOff(int no) throws android.os.RemoteException //此函数名是从自动生成的java文件ILedService.java中拷贝而来的
{
return native_LedOff( no );
} public LedService()
{
Slog.d(TAG,"LedService");
} public static native int native_LedOpen(); //jni的函数声明
public static native int native_LedOn( int no ); //jni的函数声明
public static native int native_LedOff( int no ); //jni的函数声明 }
注册到manager。
修改文件 frameworks/base/services/java/com/android/server/SystemServer.java 。
以Vibrator为基准。
添加以下代码:
LedService led = null;
~~~~~~~~~
Slog.i(TAG, "Led Service");
led = new LedService();
ServiceManager.addService("led", led);
修改cpp文件。
在frameworks/base/services/core/jni/ 目录下以Vibrator为基准创建文件com_android_server_LedService.cpp
#define LOG_TAG "LedService" #include "jni.h"
#include "JNIHelp.h"
#include "android_runtime/AndroidRuntime.h" #include <utils/misc.h>
#include <utils/Log.h>
#include <hardware/led.h> #include <stdio.h>
struct led_device_t *led_dev; //此为在HAL硬件抽象层中自己定义的结构体 namespace android
{ static jint LedOpen( JNIEnv *env, jobject clazz ) //前面两个参数必须要有
{
hw_module_t *module;
hw_device_t *device;
hw_get_module( "led", (hw_module_t const **)&module ); //依靠”led“获取HAL抽象层中的结构体指针 module->methods->open( module, NULL, &device); //依旧是在抽象层中实现的 led_dev = (struct led_device_t *)device; return ;
} static jint LedOn( JNIEnv *env, jobject clazz, int no ) //前面两个参数必须要有,后面的为函数自身的参数
{
led_dev->set_on( led_dev, no );
return ;
} static jint LedOff( JNIEnv *env, jobject clazz, int no )
{
led_dev->set_off( led_dev, no );
return ;
} static JNINativeMethod method_table[] = {
{ "native_LedOpen", "()I", (void*)LedOpen }, //需要的用到的函数名字( ”java中用到的名字“, (参数)返回值, 在cpp中具体实现的名字 )
{ "native_LedOn", "(I)I", (void*)LedOn },
{ "native_LedOff", "(I)I", (void*)LedOff },
}; int register_android_server_LedService(JNIEnv *env)
{
return jniRegisterNativeMethods(env, "com/android/server/LedService", //哪个类需要用到
method_table, NELEM(method_table));
} };
完成之后,需要调用 int register_android_server_LedService(JNIEnv *env) 函数。
在frameworks/base/services/core/jni/onload.cpp文件中添加以下代码:
申明:int register_android_server_LedService(JNIEnv *env);
调用:register_android_server_LedService(env);
修改frameworks/base/services/core/jni/Android.mk
添加: $(LOCAL_REL_DIR)/com_android_server_LedService.cpp \
编译: mmm frameworks/base/services/
成功后 生成system.img映像即可。
Android驱动入门-LED--HAL硬件访问服务层②的更多相关文章
- Android驱动入门-Led控制+app+ndk库+底层驱动
硬件平台: FriendlyARM Tiny4412 Cortex-A9 操作系统: UBUNTU 14.04 LTS 时间:2016-09-20 21:56:48 本次实验使用的是 安卓APP + ...
- android驱动学习---led实验
======================== 驱动: 内核:android-kernel 2.6.36 (必须对应你的板子上内核,不然会出现insmod错误) 目的:通过android应用层用户 ...
- Android驱动入门-LED--HAL硬件抽象层程序设计①
硬件平台: FriendlyARM Tiny4412 Cortex-A9 操作系统: UBUNTU 14.04 LTS 时间:2016-09-21 16:15:26 设计HAL硬件抽象层程序,则需要 ...
- Android驱动入门-LED--测试APP编写③
硬件平台: FriendlyARM Tiny4412 Cortex-A9 操作系统: UBUNTU 14.04 LTS 时间:2016-09-24 10:47:03 在Android Studio中 ...
- Android驱动入门-在Android系统上运行JAVA程序
在linux上运行java程序,直接用javac编译,再用java运行就行了.但是在Android上,由于虚拟机和pc端的不同,所以操作方法也是不一样的. 如果想在Android上运行Hello wo ...
- Android驱动学习-APP操作新硬件的两种方法(支持添加的驱动)
在给Android添加新的驱动后,app要如何使用呢? 正常的使用一个设备,需要getService.但是像LED等我们自己添加的硬件驱动,Android源代码根本没有我们自己添加的服务. 第一种: ...
- 硬件访问服务学习笔记_WDS
1.Android驱动框架App1 App2 App3 App4-------------------硬件访问服务-------------------JNI-------------------C库 ...
- LED硬件访问服务(2)——JNI/HAL
一.系统编程 1.SystemServer.java类中提供了main()方法,说明它是以一个进程的方式存在的,启动后直接执行其run() 2.注册服务ServiceManager.addServic ...
- 6.4 Android硬件访问服务编写HAL代码
JNI向上提供本地函数,向下加载HAL文件,并调用HAL的函数: HAL负责访问驱动程序执行硬件操作 JNI和HAL都是用c语言或者C++语言编写的,JNI加载HAL的实质就是使用dlopen加载动态 ...
随机推荐
- 百度在线编辑器UEditor(v1.3.6) .net环境下详细配置教程之更改图片和附件上传路径
本文是接上一篇博客,如果有疑问请先阅读上一篇:百度在线编辑器UEditor(v1.3.6) .net环境下详细配置教程 默认UEditor上传图片的路径是,编辑器包目录里面的net目录下 下面就演示如 ...
- SAP中删除假脱机请求
好几次公司的SAP都碰到所有的SMARTFORM都打印不了的情况.查了一下原因原来是假脱机请求太多了.清了一下,问题就解决了. 删除假脱机请求的一些方法: 1.避免经常出现此类错误,最好还 ...
- Linux机器24项安全合规设置
工作的一些内容,这是中国移动集团当前linux机器安全合规标准,找了点时间将其归类,并查了一些资料,每项配置是什么意思,不仅要知其然,还要知其所以然.好记性不如烂笔头. 1. 检查FTP配置-限制用 ...
- Android Tips: 打电话和发短信
利用Android打电话非常简单,直接调用Android内在的电话功能就可以了. btnDail.setOnClickListener(new OnClickListener(){ @Override ...
- iOS 单例传值遇见问题
单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 1.单例模式的要点: 显然单例模式的要点有三个:一是某个类只能有一个实例: ...
- IOS动画
基础动画 //创建基础动画 CABasicAnimation * basic = [CABasicAnimation animation]; //动画路径 basic.keyPath ...
- OS开发UI篇—使用UItableview完成一个简单的QQ好友列表
本文转自:http://www.cnblogs.com/wendingding/p/3763330.html 一.项目结构和plist文件 二.实现代码 1.说明: 主控制器直接继承UITableVi ...
- 系统吞吐量、TPS(QPS)、用户并发量、性能测试概念和公式
PS:下面是性能测试的主要概念和计算公式,记录下: 一.系统吞度量要素: 一个系统的吞度量(承压能力)与request对CPU的消耗.外部接口.IO等等紧密关联.单个reqeust 对CPU消耗越高, ...
- php示例代码之 使用PHP的MySQL标准函数
<?php //连接参数 $host="localhost"; $user="root"; $pwd="111111"; $db=&q ...
- 全站HTTPs,没那么简单
“全站 HTTPs”俨然成了目前的热门话题,很多网站都在摩拳擦掌要实行全站 HTTPs.凑巧,我们(沪江)也在推行这个计划. 一开始大家想得都很简单,把证书购买了.配好了,相应的路径改一改,就没有问题 ...