ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
在本节中,我们将通过编写一个C可执行程序来验证驱动程序freg所提供的dev文件系统接口的正确性,这是通过调用read和write函数读写设备文件/dev/freg的内容来实现的。对于Android应用程序开发者来说,可能会觉得奇怪,怎么能在Android系统中编写C语言程序呢?其实在Android源代码工程环境中,不仅可以用C/C++语言来开发可执行程序,还可以开发动态链接库,即so文件。使用adb工具命令连接上Android模拟器之后,进入到/system/bin或者/system/lib目录中,就可以看到很多可执行程序或者动态链接库文件。在接下来的2.3小节中,我们为虚拟硬件设备freg所编写的硬件抽象层模块接口其实就是一个动态链接库文件。 在Android源代码工程环境中开发的C可执行程序源文件一般保存在external目录中,因此,我们进入到external目录中,并且创建一个freg目录,用来保存我们将要开发的C可执行程序源文件。它的目录结构如下: ~~~ ~/Android ----external ----freg ----freg.c ----Android.mk ~~~ 这个C应用程序只有一个源文件 freg.c和一个编译脚本文件Android.mk。下面我们就详细分析这两个文件的内容。 **freg.c** ~~~ #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #define FREG_DEVICE_NAME "/dev/freg" int main(int argc, char** argv) { int fd = -1; int val = 0; fd = open(FREG_DEVICE_NAME, O_RDWR); if(fd == -1) { printf("Failed to open device %s.\n", FREG_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, FREG_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 } ~~~ 第11行通过调用open函数,并且以读写方式打开设备文件/dev/freg;接着第18行调用read函数读取它的内容,即读取虚拟硬件设备freg的寄存器val的内容,并且将它的内容打印出来。第23行调用write函数将一个整数5写入到虚拟硬件设备freg的寄存器val中;接着第26行和第27行再调用read和print函数将这个整数5读取并且打印出来。假设虚拟硬件设备freg的寄存器val是第一次被访问,那么如果一切正常的话,两次打印出来的内容就应该分别为0和5。 **Android.mk** ~~~ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_MODULE := freg LOCAL_SRC_FILES := $(call all-subdir-c-files) include $(BUILD_EXECUTABLE) ~~~ 这是源文件freg.c的编译脚本文件,它与使用Java语言开发的Android应用程序的编译脚本的不同之处在于include命令后面所带的参数。对于C可执行程序来说,它的编译脚本中的include命令后面跟的参数的值为$(BUILD_EXECUTABLE),表示当前要编译的是一个可执行应用程序模块,并且将编译结果保存在out/target/product/gerneric/system/bin目录中。 准备好这两个文件之后,我们就可以通过mmm和make snod命令来编译和打包这个C可执行程序了。 ~~~ USER@MACHINE:~/Android$ mmm ./external/freg/ USER@MACHINE:~/Android$ make snod ~~~ 编译成功后,就可以在out/target/product/gerneric/system/bin目录下看到一个freg文件;而当打包成功后,这个文件就会包含在out/target/product/gerneric目录下的Android系统镜像文件system.img中。 最后,我们就可以使用编译和打包后得到的system.img文件启动Android模拟器,然后使用adb工具连接上它,并且进入到/system/bin目录中,执行里面的freg文件来验证驱动程序freg的dev文件系统访问接口的正确性。 ~~~ USER@MACHINE: ~/Android$ emulator -kernel kernel/goldfish/arch/arm/boot/zImage & USER@MACHINE: ~/Android$ adb shell root@android:/ # cd system/bin root@android:/system/bin # ./freg Read original value: 0. Write value 5 to /dev/freg. Read the value again: 5. ~~~ 如果能够看到上面的输出,就说明驱动程序freg所提供的dev文件系统访问接口是正确的。 接下来,我们继续介绍如何为虚拟硬件设备freg编写硬件抽象层模块接口。