老罗版本参见:

        在前一篇文章中,我们介绍了如何在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内核驱动程序呢?