一. 參照在Ubuntu上爲Android系統編寫Linux內核驅動程序一文,準備好Linux驅動程序。使用Android模擬器加載包含這個Linux驅動程序的內核文件,並且使用adb shell命令連接上模擬,驗證在/dev目錄中存在設備文件hello。
二. 進入到Android源代碼工程的external目錄,創建hello目錄:
USER-NAME@MACHINE-NAME:~/Android$ cd external
USER-NAME@MACHINE-NAME:~/Android/external$ mkdir hello
三. 在hello目錄中新建hello.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;
- }
這個程序的作用中,打開/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)
include $(BUILD_EXECUTABLE)
注意,BUILD_EXECUTABLE表示我們要編譯的是可執行程序。
五. 參照如何單獨編譯Android源代碼中的模塊一文,使用mmm命令進行編譯:
USER-NAME@MACHINE-NAME:~/Android$ mmm ./external/hello
編譯成功後,就可以在out/target/product/gerneric/system/bin目錄下,看到可執行文件hello了。
七. 把hello可執行文件 使用adb 傳輸到開發板的系統文件system/bin/下面
root@android:/ # cd system/bin
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內核驅動程序,敬請期待。