实现硬件访问服务

一、

1、定义硬件访问服务接口(为了进程间通信)

~/android-2.3_r1/frameworks/base

----Android.mk

----/core/java/android/os/IFregService.aidl

Android系统提供了一种描述语言来定义具有跨进程访问能力的服务接口,这种描述语言称为Android接口描述语言(AIDL)。

IFregService.aidl

package android.os;

interface IFregService {
	void setVal(int val);
	int getVal();
}

Android.mk

LOCAL_SRC_FILES += /

   ....................................................................

   core/java/android/os/IVibratorService.aidl /

   core/java/android/os/IFregService.aidl /

   core/java/android/service/urlrenderer/IUrlRendererService.aidl /

2、编译

编译aidl:

生成的IFregService.java文件位于out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/os中。

IFregService.java

/*
 * This file is auto-generated.  DO NOT MODIFY.
 * Original file: frameworks/base/core/java/android/os/IFregService.aidl
 */
package android.os;

public interface IFregService extends android.os.IInterface {
	/** Local-side IPC implementation stub class. */
	public static abstract class Stub extends android.os.Binder implements
			android.os.IFregService {
		private static final java.lang.String DESCRIPTOR = "android.os.IFregService";

		/** Construct the stub at attach it to the interface. */
		public Stub() {
			this.attachInterface(this, DESCRIPTOR);
		}

		/**
		 * Cast an IBinder object into an android.os.IFregService interface,
		 * generating a proxy if needed.
		 */
		public static android.os.IFregService asInterface(android.os.IBinder obj) {
			if ((obj == null)) {
				return null;
			}
			android.os.IInterface iin = (android.os.IInterface) obj
					.queryLocalInterface(DESCRIPTOR);
			if (((iin != null) && (iin instanceof android.os.IFregService))) {
				return ((android.os.IFregService) iin);
			}
			return new android.os.IFregService.Stub.Proxy(obj);
		}

		public android.os.IBinder asBinder() {
			return this;
		}

		@Override
		public boolean onTransact(int code, android.os.Parcel data,
				android.os.Parcel reply, int flags)
				throws android.os.RemoteException {
			switch (code) {
			case INTERFACE_TRANSACTION: {
				reply.writeString(DESCRIPTOR);
				return true;
			}
			case TRANSACTION_setVal: {
				data.enforceInterface(DESCRIPTOR);
				int _arg0;
				_arg0 = data.readInt();
				this.setVal(_arg0);
				reply.writeNoException();
				return true;
			}
			case TRANSACTION_getVal: {
				data.enforceInterface(DESCRIPTOR);
				int _result = this.getVal();
				reply.writeNoException();
				reply.writeInt(_result);
				return true;
			}
			}
			return super.onTransact(code, data, reply, flags);
		}

		private static class Proxy implements android.os.IFregService {
			private android.os.IBinder mRemote;

			Proxy(android.os.IBinder remote) {
				mRemote = remote;
			}

			public android.os.IBinder asBinder() {
				return mRemote;
			}

			public java.lang.String getInterfaceDescriptor() {
				return DESCRIPTOR;
			}

			public void setVal(int val) throws android.os.RemoteException {
				android.os.Parcel _data = android.os.Parcel.obtain();
				android.os.Parcel _reply = android.os.Parcel.obtain();
				try {
					_data.writeInterfaceToken(DESCRIPTOR);
					_data.writeInt(val);
					mRemote.transact(Stub.TRANSACTION_setVal, _data, _reply, 0);
					_reply.readException();
				} finally {
					_reply.recycle();
					_data.recycle();
				}
			}

			public int getVal() throws android.os.RemoteException {
				android.os.Parcel _data = android.os.Parcel.obtain();
				android.os.Parcel _reply = android.os.Parcel.obtain();
				int _result;
				try {
					_data.writeInterfaceToken(DESCRIPTOR);
					mRemote.transact(Stub.TRANSACTION_getVal, _data, _reply, 0);
					_reply.readException();
					_result = _reply.readInt();
				} finally {
					_reply.recycle();
					_data.recycle();
				}
				return _result;
			}
		}

		static final int TRANSACTION_setVal = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
		static final int TRANSACTION_getVal = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);
	}

	public void setVal(int val) throws android.os.RemoteException;

	public int getVal() throws android.os.RemoteException;
}

最后生成的framework.jar文件位于out/target/product/generic/system/framework中。

3、实现硬件访问服务

~/android-2.3_r1/frameworks/base/services/java/com/android/server

----FregService.java

package com.android.server;

import android.content.Context;
import android.os.IFregService;
import android.util.Slog;

public class FregService extends IFregService.Stub {
	private static final String TAG = "FregService";

	private int mPtr = 0;

	FregService() {
		mPtr = init_native();

		if(mPtr == 0) {
			Slog.e(TAG, "Failed to initialize freg service.");
		}
	}

	public void setVal(int val) {
		if(mPtr == 0) {
			Slog.e(TAG, "Freg service is not initialized.");
			return;
		}

		setVal_native(mPtr, val);
	}	

	public int getVal() {
		if(mPtr == 0) {
			Slog.e(TAG, "Freg service is not initialized.");
			return 0;
		}

		return getVal_native(mPtr);
	}

	private static native int init_native();//调用jni方法
    	private static native void setVal_native(int ptr, int val);
	private static native int getVal_native(int ptr);
};

4、编译

编译生成的services.jar位于out/target/product/generic/system/framework中。

二、

1、启动硬件访问服务

~/android-2.3_r1/frameworks/base/services/java/com/android/server

----SystemServer.java

修改ServerThread类的成员函数run的实现,如下所示:

@Override

     public void run() {

     ....................................................................................

            try {

                  Slog.i(TAG, "DiskStats Service");

                  ServiceManager.addService("diskstats", new DiskStatsService(context));

            } catch (Throwable e) {

                  Slog.e(TAG, "Failure starting DiskStats Service", e);

            }

            try {

                  Slog.i(TAG, "Hello Service");

                  ServiceManager.addService("hello", new FregService());

            } catch (Throwable e) {

                  Slog.e(TAG, "Failure starting Freg Service", e);

            }

2、编译

编译生成的services.jar位于out/target/product/generic/system/framework中。

最后把services.jar和framework.jar重新打包进入system.img,位于out/target/product/gerneric中。

实现硬件访问服务,布布扣,bubuko.com

时间: 2024-12-28 01:41:47

实现硬件访问服务的相关文章

实现硬件访问服务的JNI方法

1.实现硬件访问服务的JNI方法 ~/android-2.3_r1/frameworks/base/services/jni ----com_android_server_FregService.cpp ----onload.cpp ----Android.mk com_android_server_FregService.cpp #define LOG_TAG "FregServiceJNI" #include "jni.h" #include "JNI

开发Android应用程序来使用硬件访问服务

1.开发Android应用程序来使用硬件访问服务 ~/android-2.3_r1/packages/experimental/Freg ----AndroidManifest.java ----Android.mk ----src ----shy/luo/freg ----Freg.java ----res ----layout ----main.xml ----values ----string.xml ----drawable ----icon.png Freg.java package

开发Android硬件访问服务

在http://blog.csdn.net/getnextwindow/article/details/47731597中,为Android系统添加了HAL模块,开发好一个硬件抽象层以后,我们通常还需要在应用程序框架中实现一个硬件访问服务.硬件访问服务通过硬件抽象层(HAL)模块来为应用程序提供读写操作.由于硬件抽象层使用c++开发,而应用程序框架中的硬件访问服务是Java语言开发的,因此,硬件访问服务必须通过JNI来调用抽象层模块的接口. Android系统的硬件访问服务通常运行在系统进程Sy

在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6578352 在数字科技日新月异的今天,软件和硬件的完美结合,造就了智能移动设备的流行.今天大家对iOS和Android系统的趋之若鹜,一定程度上是由于这两个系统上有着丰富多彩的各种应用软件.因此,软件和硬件的关系,在一定程度上可以说,硬件是为软件服务的.硬件工程师研发出一款硬件设备,自然少了软件工程师为其编写驱动程序:而驱动程序的最终目的,是为

在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务(老罗学习笔记5)

在数字科技日新月异的今天,软件和硬件的完美结合,造就了智能移动设备的流行.今天大家对iOS和Android系统的趋之若鹜,一定程度上是由于这两个系统上有着丰富多彩的各种应用软件.因此,软件和硬件的关系,在一定程度上可以说,硬件是为软件服务的.硬件工程师研发出一款硬件设备,自然少了软件工程师为其编写驱动程序:而驱动程序的最终目的,是为了使得最上层的应用程序能够使用这些硬件提供的服务来为用户提供软件功能.对Android系统上的应用软件来说,就是要在系统的Application Frameworks

6.5 Android硬件访问服务使用反射

1.前面的例子中App为了能够范问ILedService接口,把classes.jar导入到应用程序中,但是我们不想把classes编进apk包里面去,这样导致我们的apk程序会很大(解压缩apk会发现里面有classes.dex和classes2.dex这两个优化后的包) 因此这里修改编译选项: 在Android studio中 file->Project Structure->点击左边我们的app->点击右边的Dependencies,找到下面的classes,其Scope列表中的值

第1课第4.4节_Android硬件访问服务编写HAL代码

4 编写HAL代码 源码下载方法 第一次: git clone https://github.com/weidongshan/SYS_0001_LEDDemo.git 更新: git pull origin 取出指定版本: git checkout v1 // 有JNI没有HAL git checkout v2 // 有JNI,HAL git checkout v3 // add MODULE TAG, DEVICE TAG JNI 向上提供本地函数, 向下加载HAL文件并调用HAL的函数HAL

6.2、Android硬件访问服务编写系统代码

1.实现接口文件给App使用,接口文件是应用程序查询获得服务时获得 使用AIDL(Android接口定义语言)来实现ILedService.java接口 定义ILedService.aidl interface ILedService { int IedCtrl(int which,int status); } 把ILedService.aidl放在已经编译好的Android系统源码中的目录:frameworks/base/core/java/android/os目录下,同时修改framewor

LED硬件方法服务(2)

一.系统编程 1.SystemServer.java类中提供了main()方法,说明它是以一个进程的方式存在的,启动后直接执行其run() 2.注册服务ServiceManager.addService("vibrator", vibrator);通过addService来告诉系统,告诉系统指的是service_manager.c表示的进程.service_manager管理着系统中的所有service.要想这些服务能被应用程序使用,就必须要注册进service_manager中.应用