硬件平台: 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硬件访问服务层②的更多相关文章

  1. Android驱动入门-Led控制+app+ndk库+底层驱动

    硬件平台: FriendlyARM Tiny4412 Cortex-A9 操作系统: UBUNTU 14.04 LTS 时间:2016-09-20  21:56:48 本次实验使用的是 安卓APP + ...

  2. android驱动学习---led实验

    ======================== 驱动: 内核:android-kernel 2.6.36  (必须对应你的板子上内核,不然会出现insmod错误) 目的:通过android应用层用户 ...

  3. Android驱动入门-LED--HAL硬件抽象层程序设计①

    硬件平台: FriendlyARM Tiny4412 Cortex-A9 操作系统: UBUNTU 14.04 LTS 时间:2016-09-21  16:15:26 设计HAL硬件抽象层程序,则需要 ...

  4. Android驱动入门-LED--测试APP编写③

    硬件平台: FriendlyARM Tiny4412 Cortex-A9 操作系统: UBUNTU 14.04 LTS 时间:2016-09-24  10:47:03 在Android Studio中 ...

  5. Android驱动入门-在Android系统上运行JAVA程序

    在linux上运行java程序,直接用javac编译,再用java运行就行了.但是在Android上,由于虚拟机和pc端的不同,所以操作方法也是不一样的. 如果想在Android上运行Hello wo ...

  6. Android驱动学习-APP操作新硬件的两种方法(支持添加的驱动)

    在给Android添加新的驱动后,app要如何使用呢? 正常的使用一个设备,需要getService.但是像LED等我们自己添加的硬件驱动,Android源代码根本没有我们自己添加的服务. 第一种: ...

  7. 硬件访问服务学习笔记_WDS

    1.Android驱动框架App1 App2 App3 App4-------------------硬件访问服务-------------------JNI-------------------C库 ...

  8. LED硬件访问服务(2)——JNI/HAL

    一.系统编程 1.SystemServer.java类中提供了main()方法,说明它是以一个进程的方式存在的,启动后直接执行其run() 2.注册服务ServiceManager.addServic ...

  9. 6.4 Android硬件访问服务编写HAL代码

    JNI向上提供本地函数,向下加载HAL文件,并调用HAL的函数: HAL负责访问驱动程序执行硬件操作 JNI和HAL都是用c语言或者C++语言编写的,JNI加载HAL的实质就是使用dlopen加载动态 ...

随机推荐

  1. Urban Planning and Public Health - Reflection on Professor Webster's article in Urban Planning Forum

    1. General review. Professor Webster published this article in Urban Planning Forum, one of the top ...

  2. yii 项目根目录下需要有assets目录

    yii 项目根目录下需要有assets目录,如果没有,会导致gii失效

  3. Android通过PHP服务器实现登录

    Android客户端和PHP.MySQL搭建的服务器之间的简单交互,实现登录功能 . 实现原理图: Handler消息机制原理: Handler机制主要包括4个关键对象,分别是Message.Hand ...

  4. Gradle多渠道打包

    国内Android市场众多渠道,为了统计每个渠道的下载及其它数据统计,就需要我们针对每个渠道单独打包 以友盟多渠道打包为例 在AndroidManifest.xml里面 <meta-data a ...

  5. 【即时通讯】XMPP调试与简单使用

    上篇讲了[即时通讯]即时通讯及XMPP概述及环境配置,接下来我们就要进行调试,看看是否可用! 在测试之前我们需要先事先保存一些东西,以便后面使用 —— 登录openfire后台 ——获取服务器名和端口 ...

  6. Android 手机卫士--选中SettingItemView条目状态切换

    本文实现上篇文章中自定义组合控件中相关方法. checkBox是否选中,决定SettingItemView是否开启. 首先创建一个方法用于判断checkbox是否开启 /** * 判断是否开启的方法 ...

  7. class&meta class

    http://chun.tips 当我们发送一个消息给一个NSObject对象时,这条消息会在对象的类的方法列表里查找当我们发送一个消息给一个类时,这条消息会在类的Meta Class的方法列表里查找 ...

  8. GitHub Top 100 的项目(iOS)

    主要对当前 GitHub 排名前 100 的项目做一个简单的简介, 方便初学者快速了解到当前 Objective-C 在 GitHub 的情况. Android 版本的在此: https://gith ...

  9. Hierarchyid 常用操作

        ---------内置函数------------ select hierarchyid::GetRoot()--0x select hierarchyid::Parse('/1/1/') - ...

  10. js 静态私有变量

    特权方法:有权访问私有变量和私有函数的公有方法.在私有作用域中定义私有变量或函数,可以创建特权方法,如下: 示例1 (function(){ //私有变量和私有函数 var privateVariab ...