Android 驱动之旅: 第二章 -- 在Android 系统中增加C 可执行程序来访问硬件驱动程序
在第一篇文章中,我们介绍了如何在Ubuntu 上为Android 系统编写Linux内核驱动程序。在这个名为hello 的Linux 内核驱动程序中,创建三个不同的文件节点来供用户空间访问,分别是传统的设备文件/dev/hello、proc 系统文件/proc/hello 和devfs 系统属性文件/sys/class/hello/hello/val。进一步,还通过cat 命令来直接访问/proc/hello 和/sys/class/hello/hello/val 文件来,以验证驱动程序的正确性。在这一篇文章里,我们将通过自己编写的C 可执行程序来访问设备文件/dev/hello。可能读者会觉得奇怪,怎么能在Android 系统中用C 语言来编写应用程序呢?Android 系统上的应用程序不都是Java 应用程序吗?其实是可以的,读者不妨用adb shell 命令连上Android 模拟器,在/system/bin 目录下可以看到很多C 可执行程序,如cat 命令。今天,我们就来学习一下怎么在Android 系统中添加用C 语言编写的可执行程序吧。
一. 进入到Android 源代码工程的external 目录,创建hello 目录:
linuxidc@www.linuxidc.com:~/Android$ cd external
linuxidc@www.linuxidc.com:~/Android/external$ mkdir hello_test
二. 在hello 目录中新建hello_test.c和Android.mk 文件:
hello_test.c
#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #define DEVICE_NAME "/dev/hello" int main(int argc, char** argv) { int fd = -1; int val = 0; fd = open(DEVICE_NAME, O_RDWR); if(fd == -1) { printf("Failed to open device %s.\n", DEVICE_NAME); return -1; } printf("Read original value:\n"); read(fd, &val, sizeof(val)); printf("%d.\n\n", val); val = 5; printf("Write value %d to %s.\n\n", val, DEVICE_NAME); write(fd, &val, sizeof(val)); printf("Read the value again:\n"); read(fd, &val, sizeof(val)); printf("%d.\n\n", val); close(fd); return 0; }
Android.mk
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_MODULE := hello_test LOCAL_SRC_FILES := $(call all-subdir-c-files) include $(BUILD_EXECUTABLE)
这个程序的作用中,打开/dev/hello 文件,然后先读出/dev/hello 文件中的值,接着写入值5 到/dev/hello 中去,最后再
次读出/dev/hello 文件中的值,看看是否是我们刚才写入的值5。从/dev/hello 文件读写的值实际上就是我们虚拟的硬件的寄
存器val 的值。
三、编译
.参照如何单独编译Android 源代码中的模块一文,使用mm 命令进行编译:
cd external/hello
mm
编译成功后,就可以在out/target/product/gerneric/system/bin 目录下,看到可执行文件hello 了。
四、测试运行
root@Android:/system/bin # ./hello
Read the original value:
0.
Write value 5 to /dev/hello.
Read the value again:
5.
看到这个结果,就说我们编写的C 可执行程序可以访问我们编写的Linux 内核驱动程序了。
介绍完了如何使用C 语言编写的可执行程序来访问我们的Linux 内核驱动程序,读者可能会问,能不能在Android 的
Application Frameworks 提供Java 接口来访问Linux 内核驱动程序呢?可以的,接下来的几篇文章中,我们将介绍如何在Android
的Application Frameworks 中,增加Java 接口来访问Linux 内核驱动程序,敬请期待。