Android 驱动开发系列五

这一篇将说到 如何为JNI接口(Frameworks层)添加对应的service访问服务

 

在Android系统中,硬件服务一般是运行在一个独立的进程中为各种应用程序提供服务。因此,调用这些硬件服务的应用程序与这些硬件服务之间

的痛惜需要通过代理来进行。为此,我们需要先定义好通信的接口。

 

1、定义通信接口

进入到android-4.0.4_r1.2/frameworks/base/core/java/android/os目录,添加 ITTTService.aidl 文件:

root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2/frameworks/base/core/java/android/os# gedit ITTTService.aidl 
root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2/frameworks/base/core/java/android/os#

其内容如下:

package android.os;

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


 

2、添加接口文件编译配置

进入到 android-4.0.4_r1.2/frameworks/base 目录,打开 Android.mk 文件,在 LOCAL_SRC_FILES 变量中加入这么一行:

	core/java/android/os/ITTTService.aidl \


 

3、实现service处理

进入到 android-4.0.4_r1.2/frameworks/base/services/java/com/android/server 目录,添加 TTTService.java 文件:

root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2/frameworks/base/services/java/com/android/server# gedit TTTService.java 

文件内容如下:

package com.android.server;

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

public class TTTService extends ITTTService.Stub{
	private static final String TAG = "TTTService";

	TTTService(){
		init_native();
	}

	public void setVal(int val){
		setVal_native(val);	
	}

	public int getVal(){
		return getVal_native();
	}

	private static native boolean init_native();
	private static native void setVal_native(int val);
	private static native int getVal_native();
};


TTTService 主要是通过调用 JNI 方法中的 init_native、setVal_native 和 getVal_native (这些接口我们在上一篇实现JNI里面提供出来的)来提供硬件服务。


 

4、配置开机启动TTTService服务

打开android-4.0.4_r1.2/frameworks/base/services/java/com/android/server 目录下的 SystemServer.java 文件,在其中的 run() 函数中找到
            try {
                Slog.i(TAG, "DiskStats Service");
                ServiceManager.addService("diskstats", new DiskStatsService(context));
            } catch (Throwable e) {
                reportWtf("starting DiskStats Service", e);
            }

这一段,在后面加上下面的代码:

            try {
                Slog.i(TAG, "TTT Service");
                ServiceManager.addService("ttt", new TTTService());
            } catch (Throwable e) {
                // TODO: handle exception
                reportWtf("Failure starting TTTService", e);
            }

在这个文件前面不用忘了加入引用:

import com.android.server.TTTService;



 

5、开始编译

我这里已经执行了 build/envsetup.sh ,就不执行了,没有执行这个的,需要先执行这个文件再进行源码编译。

执行下面的指令,编译生成ITTTService的stub接口: 

root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2# mmm frameworks/base
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.0.4
TARGET_PRODUCT=full
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=IMM76I
============================================
make:进入目录'/home/brantyou/workspace/android-4.0.4_r1.2'
target Dex: framework
Copying: out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/noproguard.classes.dex
target Jar: framework (out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/javalib.jar)
 'out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.dex' as 'classes.dex'...
Dexpreopt Boot Jar: out/target/product/generic/dex_bootjars/system/framework/framework.odex
Processing target/product/generic/dex_bootjars/system/framework/framework.jar
Done!
Install: out/target/product/generic/system/framework/framework.odex
Install: out/target/product/generic/system/framework/framework.jar
make:离开目录“/home/brantyou/workspace/android-4.0.4_r1.2”
root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2# 

 

编译 TTTService 服务:

root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2# mmm frameworks/base/services/java
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.0.4
TARGET_PRODUCT=full
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=IMM76I
============================================
make:进入目录'/home/brantyou/workspace/android-4.0.4_r1.2'
target Java: services (out/target/common/obj/JAVA_LIBRARIES/services_intermediates/classes)
注意:某些输入文件使用或覆盖了已过时的 API。
注意:要了解详细信息,请使用 -Xlint:deprecation 重新编译。
注意:某些输入文件使用了未经检查或不安全的操作。
注意:要了解详细信息,请使用 -Xlint:unchecked 重新编译。
Copying: out/target/common/obj/JAVA_LIBRARIES/services_intermediates/classes-jarjar.jar
Copying: out/target/common/obj/JAVA_LIBRARIES/services_intermediates/emma_out/lib/classes-jarjar.jar
Copying: out/target/common/obj/JAVA_LIBRARIES/services_intermediates/classes.jar
Copying: out/target/common/obj/JAVA_LIBRARIES/services_intermediates/noproguard.classes.jar
target Dex: services
Copying: out/target/common/obj/JAVA_LIBRARIES/services_intermediates/noproguard.classes.dex
target Jar: services (out/target/common/obj/JAVA_LIBRARIES/services_intermediates/javalib.jar)
 'out/target/common/obj/JAVA_LIBRARIES/services_intermediates/classes.dex' as 'classes.dex'...
Dexpreopt Boot Jar: out/target/product/generic/dex_bootjars/system/framework/android.policy.odex
Processing target/product/generic/dex_bootjars/system/framework/android.policy.jar
Done!
Dexpreopt Boot Jar: out/target/product/generic/dex_bootjars/system/framework/services.odex
Processing target/product/generic/dex_bootjars/system/framework/services.jar
Done!
Install: out/target/product/generic/system/framework/services.odex
Install: out/target/product/generic/system/framework/services.jar
make:离开目录“/home/brantyou/workspace/android-4.0.4_r1.2”
root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2# 


重新打包 system.img :

root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2# make snod
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.0.4
TARGET_PRODUCT=full_smdkv210
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a-neon
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=IMM76I
============================================
build/core/Makefile:25: 警告:覆盖关于目标“out/target/product/smdkv210/system/bin/pppd”的命令
build/core/base_rules.mk:523: 警告:忽略关于目标“out/target/product/smdkv210/system/bin/pppd”的旧命令
make snod: ignoring dependencies
Target system fs image: out/target/product/smdkv210/system.img
out/target/product/smdkv210/system.img total size is 150853824
root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2# 


 

好,到此,添加Service访问JNI接口的已经完了。接下来将会是Android程序调用Service服务来调用底层接口读写。

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值