Ubuntu中為Android系統(tǒng)上實現(xiàn)內置C可執(zhí)行程序測試Linux內核驅動程序
在前一篇文章中,我們介紹了如何在Ubuntu上為Android系統(tǒng)編寫Linux內核驅動程序。在這個名為hello的Linux內核驅動程序中,創(chuàng)建三個不同的文件節(jié)點來供用戶空間訪問,分別是傳統(tǒng)的設備文件/dev/hello、proc系統(tǒng)文件/proc/hello和devfs系統(tǒng)屬性文件/sys/class/hello/hello/val。進一步,還通過cat命令來直接訪問/proc/hello和/sys/class/hello/hello/val文件來,以驗證驅動程序的正確性。在這一篇文章里,我們將通過自己編寫的C可執(zhí)行程序來訪問設備文件/dev/hello??赡茏x者會覺得奇怪,怎么能在Android系統(tǒng)中用C語言來編寫應用程序呢?Android系統(tǒng)上的應用程序不都是Java應用程序嗎?其實是可以的,讀者不妨用adb shell命令連上Android模擬器,在/system/bin目錄下可以看到很多C可執(zhí)行程序,如cat命令。今天,我們就來學習一下怎么在Android系統(tǒng)中添加用C語言編寫的可執(zhí)行程序吧。
一. 參照在Ubuntu Android系統(tǒng)上編寫Linux內核驅動程序實現(xiàn)方法一文,準備好Linux驅動程序。使用Android模擬器加載包含這個Linux驅動程序的內核文件,并且使用adb shell命令連接上模擬,驗證在/dev目錄中存在設備文件hello。
二. 進入到Android源代碼工程的external目錄,創(chuàng)建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表示我們要編譯的是可執(zhí)行程序。
五. 參照如何單獨編譯Android源代碼中的模塊一文,使用mmm命令進行編譯:
USER-NAME@MACHINE-NAME:~/Android$ mmm ./external/hello
編譯成功后,就可以在out/target/product/gerneric/system/bin目錄下,看到可執(zhí)行文件hello了。
六. 重新打包Android系統(tǒng)文件system.img:
USER-NAME@MACHINE-NAME:~/Android$ make snod
這樣,重新打包后的system.img文件就包含剛才編譯好的hello可執(zhí)行文件了。
七. 運行模擬器,使用/system/bin/hello可執(zhí)行程序來訪問Linux內核驅動程序:
USER-NAME@MACHINE-NAME:~/Android$ emulator -kernel ./kernel/common/arch/arm/boot/zImage &
USER-NAME@MACHINE-NAME:~/Android$ adb shell
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可執(zhí)行程序可以訪問我們編寫的Linux內核驅動程序了。
介紹完了如何使用C語言編寫的可執(zhí)行程序來訪問我們的Linux內核驅動程序,讀者可能會問,能不能在Android的Application Frameworks提供Java接口來訪問Linux內核驅動程序呢?可以的,接下來的幾篇文章中,我們將介紹如何在Android的Application Frameworks中,增加Java接口來訪問Linux內核驅動程序,敬請期待。
后續(xù)繼續(xù)對這部分的資料整理,謝謝大家支持本站!
相關文章
關于Android Studio安裝完后activity_main.xml前幾行報錯的解決建議
這篇文章主要介紹了關于Android Studio安裝完后activity_main.xml前幾行報錯的解決建議,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03Android使用自定義View繪制漸隱漸現(xiàn)動畫
這篇文章主要介紹了Android使用自定義View繪制漸隱漸現(xiàn)動畫效果的相關內容,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-09-09Android 使用Vitamio打造自己的萬能播放器(3)——本地播放(主界面、播放列表)
本文主要介紹 Android Vitamio本地播放功能,這里提供實例代碼和效果圖以便大家參考,有需要的小伙伴可以參考下2016-07-07Android WebView交互傳遞json字符串并解析的方法
這篇文章主要給大家介紹了關于Android中WebView交互傳遞json字符串并解析的相關資料,文中通過示例代碼介紹的非常詳細,對各位Android開發(fā)者具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2018-05-05