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 文件:

[cpp] view plaincopy
  1. root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2/frameworks/base/core/java/android/os# gedit ITTTService.aidl   
  2. root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2/frameworks/base/core/java/android/os#  

其内容如下:

[cpp] view plaincopy
  1. package android.os;  
  2.   
  3. interface ITTTService{  
  4.     void setVal(int val);  
  5.     int getVal();  
  6. }  


 

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

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

[cpp] view plaincopy
  1. core/java/android/os/ITTTService.aidl \  


 

3、实现service处理

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

[cpp] view plaincopy
  1. root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2/frameworks/base/services/java/com/android/server# gedit TTTService.java   

文件内容如下:

[cpp] view plaincopy
  1. package com.android.server;  
  2.   
  3. import android.content.Context;  
  4. import android.os.ITTTService;  
  5. import android.util.Slog;  
  6.   
  7. public class TTTService extends ITTTService.Stub{  
  8.     private static final String TAG = "TTTService";  
  9.   
  10.     TTTService(){  
  11.         init_native();  
  12.     }  
  13.   
  14.     public void setVal(int val){  
  15.         setVal_native(val);   
  16.     }  
  17.   
  18.     public int getVal(){  
  19.         return getVal_native();  
  20.     }  
  21.   
  22.     private static native boolean init_native();  
  23.     private static native void setVal_native(int val);  
  24.     private static native int getVal_native();  
  25. };  


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);
            }

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

[cpp] view plaincopy
  1. try {  
  2.     Slog.i(TAG, "TTT Service");  
  3.     ServiceManager.addService("ttt"new TTTService());  
  4. catch (Throwable e) {  
  5.     // TODO: handle exception  
  6.     reportWtf("Failure starting TTTService", e);  
  7. }  

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

[cpp] view plaincopy
  1. import com.android.server.TTTService;  



 

5、开始编译

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

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

[cpp] view plaincopy
  1. root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2# mmm frameworks/base  
  2. ============================================  
  3. PLATFORM_VERSION_CODENAME=REL  
  4. PLATFORM_VERSION=4.0.4  
  5. TARGET_PRODUCT=full  
  6. TARGET_BUILD_VARIANT=eng  
  7. TARGET_BUILD_TYPE=release  
  8. TARGET_BUILD_APPS=  
  9. TARGET_ARCH=arm  
  10. TARGET_ARCH_VARIANT=armv7-a  
  11. HOST_ARCH=x86  
  12. HOST_OS=linux  
  13. HOST_BUILD_TYPE=release  
  14. BUILD_ID=IMM76I  
  15. ============================================  
  16. make:进入目录'/home/brantyou/workspace/android-4.0.4_r1.2'  
  17. target Dex: framework  
  18. Copying: out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/noproguard.classes.dex  
  19. target Jar: framework (out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/javalib.jar)  
  20.  'out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.dex' as 'classes.dex'...  
  21. Dexpreopt Boot Jar: out/target/product/generic/dex_bootjars/system/framework/framework.odex  
  22. Processing target/product/generic/dex_bootjars/system/framework/framework.jar  
  23. Done!  
  24. Install: out/target/product/generic/system/framework/framework.odex  
  25. Install: out/target/product/generic/system/framework/framework.jar  
  26. make:离开目录“/home/brantyou/workspace/android-4.0.4_r1.2”  
  27. root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2#   

 

编译 TTTService 服务:

[cpp] view plaincopy
  1. root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2# mmm frameworks/base/services/java  
  2. ============================================  
  3. PLATFORM_VERSION_CODENAME=REL  
  4. PLATFORM_VERSION=4.0.4  
  5. TARGET_PRODUCT=full  
  6. TARGET_BUILD_VARIANT=eng  
  7. TARGET_BUILD_TYPE=release  
  8. TARGET_BUILD_APPS=  
  9. TARGET_ARCH=arm  
  10. TARGET_ARCH_VARIANT=armv7-a  
  11. HOST_ARCH=x86  
  12. HOST_OS=linux  
  13. HOST_BUILD_TYPE=release  
  14. BUILD_ID=IMM76I  
  15. ============================================  
  16. make:进入目录'/home/brantyou/workspace/android-4.0.4_r1.2'  
  17. target Java: services (out/target/common/obj/JAVA_LIBRARIES/services_intermediates/classes)  
  18. 注意:某些输入文件使用或覆盖了已过时的 API。  
  19. 注意:要了解详细信息,请使用 -Xlint:deprecation 重新编译。  
  20. 注意:某些输入文件使用了未经检查或不安全的操作。  
  21. 注意:要了解详细信息,请使用 -Xlint:unchecked 重新编译。  
  22. Copying: out/target/common/obj/JAVA_LIBRARIES/services_intermediates/classes-jarjar.jar  
  23. Copying: out/target/common/obj/JAVA_LIBRARIES/services_intermediates/emma_out/lib/classes-jarjar.jar  
  24. Copying: out/target/common/obj/JAVA_LIBRARIES/services_intermediates/classes.jar  
  25. Copying: out/target/common/obj/JAVA_LIBRARIES/services_intermediates/noproguard.classes.jar  
  26. target Dex: services  
  27. Copying: out/target/common/obj/JAVA_LIBRARIES/services_intermediates/noproguard.classes.dex  
  28. target Jar: services (out/target/common/obj/JAVA_LIBRARIES/services_intermediates/javalib.jar)  
  29.  'out/target/common/obj/JAVA_LIBRARIES/services_intermediates/classes.dex' as 'classes.dex'...  
  30. Dexpreopt Boot Jar: out/target/product/generic/dex_bootjars/system/framework/android.policy.odex  
  31. Processing target/product/generic/dex_bootjars/system/framework/android.policy.jar  
  32. Done!  
  33. Dexpreopt Boot Jar: out/target/product/generic/dex_bootjars/system/framework/services.odex  
  34. Processing target/product/generic/dex_bootjars/system/framework/services.jar  
  35. Done!  
  36. Install: out/target/product/generic/system/framework/services.odex  
  37. Install: out/target/product/generic/system/framework/services.jar  
  38. make:离开目录“/home/brantyou/workspace/android-4.0.4_r1.2”  
  39. root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2#   


重新打包 system.img :

[cpp] view plaincopy
  1. root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2# make snod  
  2. ============================================  
  3. PLATFORM_VERSION_CODENAME=REL  
  4. PLATFORM_VERSION=4.0.4  
  5. TARGET_PRODUCT=full_smdkv210  
  6. TARGET_BUILD_VARIANT=eng  
  7. TARGET_BUILD_TYPE=release  
  8. TARGET_BUILD_APPS=  
  9. TARGET_ARCH=arm  
  10. TARGET_ARCH_VARIANT=armv7-a-neon  
  11. HOST_ARCH=x86  
  12. HOST_OS=linux  
  13. HOST_BUILD_TYPE=release  
  14. BUILD_ID=IMM76I  
  15. ============================================  
  16. build/core/Makefile:25: 警告:覆盖关于目标“out/target/product/smdkv210/system/bin/pppd”的命令  
  17. build/core/base_rules.mk:523: 警告:忽略关于目标“out/target/product/smdkv210/system/bin/pppd”的旧命令  
  18. make snod: ignoring dependencies  
  19. Target system fs image: out/target/product/smdkv210/system.img  
  20. out/target/product/smdkv210/system.img total size is 150853824  
  21. root@brantyou-ubuntu:~/workspace/android-4.0.4_r1.2#   


 

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

 

0 0
原创粉丝点击