老罗版本参见:https://blog.youkuaiyun.com/luoshengyang/article/details/6571210
在前一篇文章中,我们介绍了如何在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语言编写的可执行程序吧。
完整代码见:https://pan.baidu.com/s/13jG4uFJqKS_YKG543L7SKQ
提取码:vgmf
一. 参照在Ubuntu上为Android系统编写Linux内核驱动程序---Android8.0版本实现-对照老罗版本一文,准备好Linux驱动程序。在系统中使用这个C可执行程序,验证在/dev目录中存在设备文件hello。
二. 进入到Android源代码工程的external目录,创建hello目录:
zh@ubuntu:sourcecode/trunk/Android/external$ mkdir hello
三. 在hello目录中新建hello_exe.c文件:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h> // for open
#include <unistd.h> // for close
#define DEVICE_NAME "/dev/hello"
int main(int argc, char** argv) {
int fd = -1;
这个程序的作用中,打开/dev/hello文件,然后先读出/dev/hello文件中的值,接着写入值5到/dev/hello中去,最后再次读出/dev/hello文件中的值,看看是否是我们刚才写入的值5。从/dev/hello文件读写的值实际上就是我们虚拟的硬件的寄存器val的值。
四. 在hello目录中新建Android.mk文件:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := hello
LOCAL_SRC_FILES := $(call all-subdir-c-files)
#LOCAL_FLAGS += -Wno-error
include $(BUILD_EXECUTABLE)
注意,BUILD_EXECUTABLE表示我们要编译的是可执行程序。
五. 在hello目录使用mm命令进行编译:
zh@ubuntu:sourcecode/trunk/Android/external/hello$ mm -j16
编译成功后,就可以在Android/out/target/product/Hi3571V/system/bin/hello目录下,看到可执行文件hello了。
六. 将hello bin文件导入到系统,并修改为777权限
七. 使用/system/bin/hello可执行程序来访问Linux内核驱动程序:
使用前确保驱动已加载:
Hi3751V:/ # lsmod
Module Size Used by
hello 4003 1
Hi3751V:/ #
Hi3751V:/ # cat /sys/class/hello/hello/val
0
Hi3751V:/ #
驱动已正常加载,执行hello:
Hi3751V:/ # hello
Read original value:
0.
Write value 5 to /dev/hello.
Read the value again:
5.
Hi3751V:/ #
看到这个结果,就说我们编写的C可执行程序可以访问我们编写的Linux内核驱动程序了。也说明我们写的驱动程序是可用的,可以用访问/dev/hello文件的方式来进行相关操作。
介绍完了如何使用C语言编写的可执行程序来访问我们的Linux内核驱动程序,读者可能会问,能不能在Android的Application Frameworks提供Java接口来访问Linux内核驱动程序呢?可以的,接下来的几篇文章中,我们将介绍如何在Android的Application Frameworks中,增加Java接口来访问Linux内核驱动程序,敬请期待。