Ubuntu中為Android系統(tǒng)上實(shí)現(xiàn)內(nèi)置C可執(zhí)行程序測(cè)試Linux內(nèi)核驅(qū)動(dòng)程序
在前一篇文章中,我們介紹了如何在Ubuntu上為Android系統(tǒng)編寫Linux內(nèi)核驅(qū)動(dòng)程序。在這個(gè)名為hello的Linux內(nèi)核驅(qū)動(dòng)程序中,創(chuàng)建三個(gè)不同的文件節(jié)點(diǎn)來(lái)供用戶空間訪問(wèn),分別是傳統(tǒng)的設(shè)備文件/dev/hello、proc系統(tǒng)文件/proc/hello和devfs系統(tǒng)屬性文件/sys/class/hello/hello/val。進(jìn)一步,還通過(guò)cat命令來(lái)直接訪問(wèn)/proc/hello和/sys/class/hello/hello/val文件來(lái),以驗(yàn)證驅(qū)動(dòng)程序的正確性。在這一篇文章里,我們將通過(guò)自己編寫的C可執(zhí)行程序來(lái)訪問(wèn)設(shè)備文件/dev/hello??赡茏x者會(huì)覺(jué)得奇怪,怎么能在Android系統(tǒng)中用C語(yǔ)言來(lái)編寫應(yīng)用程序呢?Android系統(tǒng)上的應(yīng)用程序不都是Java應(yīng)用程序嗎?其實(shí)是可以的,讀者不妨用adb shell命令連上Android模擬器,在/system/bin目錄下可以看到很多C可執(zhí)行程序,如cat命令。今天,我們就來(lái)學(xué)習(xí)一下怎么在Android系統(tǒng)中添加用C語(yǔ)言編寫的可執(zhí)行程序吧。
一. 參照在Ubuntu Android系統(tǒng)上編寫Linux內(nèi)核驅(qū)動(dòng)程序?qū)崿F(xiàn)方法一文,準(zhǔn)備好Linux驅(qū)動(dòng)程序。使用Android模擬器加載包含這個(gè)Linux驅(qū)動(dòng)程序的內(nèi)核文件,并且使用adb shell命令連接上模擬,驗(yàn)證在/dev目錄中存在設(shè)備文件hello。
二. 進(jìn)入到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;
這個(gè)程序的作用中,打開(kāi)/dev/hello文件,然后先讀出/dev/hello文件中的值,接著寫入值5到/dev/hello中去,最后再次讀出/dev/hello文件中的值,看看是否是我們剛才寫入的值5。從/dev/hello文件讀寫的值實(shí)際上就是我們虛擬的硬件的寄存器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í)行程序。
五. 參照如何單獨(dú)編譯Android源代碼中的模塊一文,使用mmm命令進(jìn)行編譯:
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í)行文件了。
七. 運(yùn)行模擬器,使用/system/bin/hello可執(zhí)行程序來(lái)訪問(wèn)Linux內(nèi)核驅(qū)動(dòng)程序:
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.
看到這個(gè)結(jié)果,就說(shuō)我們編寫的C可執(zhí)行程序可以訪問(wèn)我們編寫的Linux內(nèi)核驅(qū)動(dòng)程序了。
介紹完了如何使用C語(yǔ)言編寫的可執(zhí)行程序來(lái)訪問(wèn)我們的Linux內(nèi)核驅(qū)動(dòng)程序,讀者可能會(huì)問(wèn),能不能在Android的Application Frameworks提供Java接口來(lái)訪問(wèn)Linux內(nèi)核驅(qū)動(dòng)程序呢?可以的,接下來(lái)的幾篇文章中,我們將介紹如何在Android的Application Frameworks中,增加Java接口來(lái)訪問(wèn)Linux內(nèi)核驅(qū)動(dòng)程序,敬請(qǐng)期待。
后續(xù)繼續(xù)對(duì)這部分的資料整理,謝謝大家支持本站!
相關(guān)文章
Android自定義手機(jī)界面狀態(tài)欄實(shí)例代碼
我們知道IOS上的應(yīng)用,狀態(tài)欄的顏色總能與應(yīng)用標(biāo)題欄顏色保持一致,用戶體驗(yàn)很不錯(cuò),那安卓是否可以呢?若是在安卓4.4之前,答案是否定的,但在4.4之后,谷歌允許開(kāi)發(fā)者自定義狀態(tài)欄背景顏色啦,這是個(gè)不錯(cuò)的體驗(yàn)2017-03-03
Android實(shí)現(xiàn)類似3D Touch菜單功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)類似3D Touch菜單功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03
Android 自定義Dialog去除title導(dǎo)航欄的解決方法
今天小編就為大家分享一篇Android 自定義Dialog去除title導(dǎo)航欄的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
Android自定義View實(shí)現(xiàn)搜索框(SearchView)功能
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)搜索框SearchView功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11
Android實(shí)現(xiàn)簡(jiǎn)單音樂(lè)播放控件
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)簡(jiǎn)單音樂(lè)播放控件,提供一個(gè)類似網(wǎng)易播放控件的默認(rèn)界面,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04
Android自定義組合控件之自定義下拉刷新和左滑刪除實(shí)例代碼
最近做了個(gè)項(xiàng)目,其中有項(xiàng)目需求,用到下拉刷新和左滑刪除,網(wǎng)上沒(méi)有找到比較理想的解決辦法。下面小編給大家分享我的一個(gè)小demo有關(guān)Android自定義組合控件之自定義下拉刷新和左滑刪除實(shí)例代碼,需要的朋友參考下2016-04-04
Android開(kāi)發(fā)之ProgressBar字體隨著進(jìn)度條的加載而滾動(dòng)
這篇文章主要介紹了Android開(kāi)發(fā)之ProgressBar字體隨著進(jìn)度條的加載而滾動(dòng),需要的朋友可以參考下2017-09-09
Android編程實(shí)現(xiàn)給Button添加圖片和文字的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)給Button添加圖片和文字的方法,涉及Android針對(duì)按鈕元素屬性的相關(guān)操作技巧,需要的朋友可以參考下2015-11-11
Android開(kāi)發(fā)教程之獲取系統(tǒng)輸入法高度的正確姿勢(shì)
這篇文章主要給大家介紹了關(guān)于Android開(kāi)發(fā)教程之獲取系統(tǒng)輸入法高度的正確姿勢(shì),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Android具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10

