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加载动态 ...
随机推荐
- ie8不兼容rgba的解决
借鉴................. 在调试ie8兼容性的问题时,发现ie8不支持rgba. 关于rgba(),即为颜色设置的方法函数,rgb代表颜色,a代表透明度. 如rgba(0,0,0,0.1 ...
- ALV的颜色分为行的颜色、列的颜色和CELL的颜色
ALV的颜色分为行的颜色.列的颜色和CELL的颜色.任务要求,将一定的Tabellenfeld 用黄色填充,也就是说CELL的颜色 DATA:ls_cellcolorTYPElvc_s_scol,co ...
- Navicat for Oracle实现连接Oracle
不知道为什么,从一开始,我就不喜欢Oracle,名字好听,功能强大,但总感觉"高不可攀";或许是因为我觉得其他的数据库就可以解决数据问题,不太了解Oracle的优势:而且它长得也不 ...
- Office 365 - SharePoint 2013 Online 中创建母版页
1.登陆SharePoint Online站点,点击右上角的设置按钮,如下图: 2.点击进入网站设置,到下面两个地方开启SharePoint Server 发布基础架构: 网站集管理 – 网站集功能 ...
- Visual Studio将Delop之后生成的dll或者wsp复制到指定目录
用VS开发sharepoint项目的时候,有很多个project,每个project都会生成一个wsp包,如果手工把wsp文件找到,复制出来,拷贝到服务器上,再部署,就有点麻烦. 所以写了个批处理命令 ...
- Git 分支管理策略
分支管理策略 下面我们来说一下一般企业中开发一个项目的分支策略: 主分支 master 开发分支 develop 功能分支 feature 预发布分支 release bug 分支 fixbug 其 ...
- Mark一下,Android ListView的上下间隙
困扰很久的问题,怎么给ListView上下加padding,可以跟随滚动的那种 android:paddingTop="10dp" android:paddingBottom=&q ...
- eclipse插件汇总
subclipse http://subclipse.tigris.org/servlets/ProjectProcess?pageID=p4wYuA 话说eclipse组织也出了一个svn的插件,但 ...
- markdown学习笔记 (一)
##类Atx形式标题 # H1标题(一个井号加文字) ### H3标题(三个井号加文字) ###### H6标题(6个井号加文字) 类setext ======== 一级标题(下行加若干个等号) == ...
- 组内Linq培训记录
注: 由于该培训是在组内分享,先写成了Word,而word中的代码都以截图方式呈现了,而在博客园不能很方便的粘贴截图进来,所以我用插入代码的方式加进来,如果文中说“如下图”或“如下图代码”,那么就直接 ...