Android 驱动开发系列五
来源:互联网 发布:张良刘邦知乎 编辑:程序博客网 时间:2024/06/02 04:11
这一篇将说到 如何为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服务来调用底层接口读写。
- Android 驱动开发系列五
- Android 驱动开发系列五
- Android 驱动开发系列五
- Android 驱动开发系列
- Android 系统开发系列五
- Android 驱动开发系列一
- Android 驱动开发系列二
- Android 驱动开发系列四
- Android 驱动开发系列三
- Android 驱动开发系列一
- Android 驱动开发系列二
- Android 驱动开发系列三
- Android 驱动开发系列四
- Android驱动开发系列六
- Android 驱动开发系列二
- Android 驱动开发系列三
- Android 驱动开发系列四
- S3C2416裸机开发系列五_Nand驱动以及Nand启动
- 树、二叉树、森林之间的转换方法
- Android 驱动开发系列四
- Do Not Go Gentle into That Good Night
- OpenGL学习02_函数语法与命名规范
- ios:UIAlertView自动消失
- Android 驱动开发系列五
- 欧拉图
- 错过一张火车票就错过回家和家人团聚的美好
- Vim编辑器的配置
- 3-3-3 while循环-验证程序
- 深入理解Android解析XML(一)
- constraintsWithVisualFormat
- OC-探究private修饰的属性能否被继承
- DNS和代理服务器的介绍