硬件平台: 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 0; } static jint LedOn( JNIEnv *env, jobject clazz, int no ) //前面两个参数必须要有,后面的为函数自身的参数 { led_dev->set_on( led_dev, no ); return 0; } static jint LedOff( JNIEnv *env, jobject clazz, int no ) { led_dev->set_off( led_dev, no ); return 0; } 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映像即可。