一、测试之前,确保上篇的驱动程序已经安装成功,且在模拟器的/dev目录下,有此设备的设备文件,即有/dev/testdev设备文件
二、进入到Android源代码工程的external目录,创建test目录:
~/Android$ cd external
~/Android/external$ mkdir test
三. 在hello目录中新建test.c文件:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
//定义要访问的设备文件名
#define DEVICE_NAME "/dev/testdev"
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 = 8;
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;
}
四. 在test目录中新建Android.mk文件:
Android.mk文件是GNU Makefile的一小部分,它用来对Android程序进行编译,可编译的类型有:
1)APK程序 : 一般的Android程序,编译打包生成apk文件
本利中Android.mk 文件如下:
LOCAL_PATH := $(call my-dir)
//首先定义好LOCAL_PATH变量。它表示是当前文件的路径。宏函数‘my-dir’, 由编译系统提供, 用于返回当前路径
include $(CLEAR_VARS) //清除变量
LOCAL_MODULE_TAGS := optional //optional:指该模块在所有版本下都编译
LOCAL_MODULE := test //模块名
LOCAL_SRC_FILES := $(call all-subdir-c-files) //模块的源文件
include $(BUILD_EXECUTABLE) //编译类型为可执行文件
五、android源代码单独编译,使用mmm命令进行编译:
//执行shell命令,获取mmm编译工具
~/Android$. ./build/envsetup.sh
//使用mmm命令进行编译
~/Android$ mmm ./external/test
编译成功后,就可以在out/target/product/gerneric/system/bin目录下,看到可执行文件test了
六. 重新打包Android系统文件system.img:
USER-NAME@MACHINE-NAME:~/Android$ make snod
这样,重新打包后的system.img文件就包含刚才编译好的test可执行文件了。
七. 运行模拟器,使用/system/bin/test可执行程序来访问Linux内核驱动程序:
/Android$ emulator -kernel ./kernel/goldfish/arch/arm/boot/zImage &
USER-NAME@MACHINE-NAME:~/Android$ adb shell
root@android:/ # cd system/bin
root@android:/system/bin # ./test
Read the original value:
0.
Write value 8 to /dev/test.
Read the value again:
8
至此完成C可执行程序访问我们编写的Linux内核驱动程序。