在Android 系統中增加C 可執行程式來訪問硬體驅動程式
在Android 系統中增加C 可執行程式來訪問硬體驅動程式。
核心驅動程式。在這個名為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 語言來編寫應用程式呢?
上的應用程式不都是Java 應用程式嗎?其實是可以的,讀者不妨用adb shell 命令連上Android模擬器,在/system/bin 目錄下
可以看到很多C 可執行程式,如cat 命令。今天,我們就來學習一下怎麼在Android 系統中新增用C 語言編寫的可執行程式吧。
一. 參照在Ubuntu 上為Android系統編寫Linux 核心驅動程式一文,準備好Linux 驅動程式。使用Android 模擬器載入
包含這個Linux 驅動程式的核心檔案,並且使用adb shell 命令連線上模擬,驗證在/dev 目錄中存在裝置檔案hello。
二. 進入到Android
[email protected]:~/Android$cd external
[email protected]:~/Android/external$mkdir hello
三. 在hello 目錄中新建hello.c 檔案:
1.#include<stdio.h>
2.#include<stdlib.h>
3.#include<fcntl.h>
4.#define DEVICE_NAME"/dev/hello"
5.int main(int argc,char** argv)
6.{
7. int fd = -1;
8. int val = 0;
9. fd =open(DEVICE_NAME, O_RDWR);
10. if(fd == -1) {
11.printf("Failed to open device %s./n", DEVICE_NAME);
12. return -1;
13. }
14.
15. printf("Readoriginal value:/n");
16. read(fd, &val,sizeof(val));
17.printf("%d./n/n", val);
18. val = 5;
19. printf("Writevalue %d to %s./n/n", val, DEVICE_NAME);
20. write(fd,&val, sizeof(val));
21.
22. printf("Readthe value again:/n");
23. read(fd, &val,sizeof(val));
24.printf("%d./n/n", val);
25. close(fd);
26. return 0;
27.}
這個程式的作用中,開啟/dev/hello檔案,然後先讀出/dev/hello 檔案中的值,接著寫入值5 到/dev/hello中去,最後再
次讀出/dev/hello檔案中的值,看看是否是我們剛才寫入的值5。從/dev/hello檔案讀寫的值實際上就是我們虛擬的硬體的寄
存器val 的值。
四. 在hello 目錄中新建Android.mk 檔案:
LOCAL_PATH := $(callmy-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 命令進行編譯:
[email protected]:~/Android$mmm ./external/hello
編譯成功後,就可以在out/target/product/gerneric/system/bin目錄下,看到可執行檔案hello 了。
六. 重新打包Android 系統檔案system.img:
[email protected]:~/Android$make snod
這樣,重新打包後的system.img檔案就包含剛才編譯好的hello 可執行檔案了。
七. 執行模擬器,使用/system/bin/hello 可執行程式來訪問Linux 核心驅動程式:
[email protected]:~/Android$emulator -kernel ./kernel/common/arch/arm/boot/zImage &
[email protected]:~/Android$adb shell
[email protected]:/ # cdsystem/bin
[email protected]:/system/bin# ./hello
Read the originalvalue:
0.
Write value 5 to/dev/hello.
Read the value again:
5.
看到這個結果,就說我們編寫的C 可執行程式可以訪問我們編寫的Linux 核心驅動程式了。
介紹完了如何使用C 語言編寫的可執行程式來訪問我們的Linux 核心驅動程式,讀者可能會問,能不能在Android 的
Application Frameworks提供Java 介面來訪問Linux 核心驅動程式呢?可以的,接下來的幾篇文章中,我們將介紹如何在Android
的ApplicationFrameworks 中,增加Java 介面來訪問Linux 核心驅動程式,敬請期待。
相關推薦
在Android 系統中增加C 可執行程式來訪問硬體驅動程式
在Android 系統中增加C 可執行程式來訪問硬體驅動程式。 核心驅動程式。在這個名為hello的Linux 核心驅動程式中,建立三個不同的檔案節點來供使用者空間訪問,分別是傳統的裝置 檔案/dev/hello、proc 系統檔案/proc/hello和devfs 系統
Android系統開機啟動C可執行檔案
在工作中有一個需求是android手機開機啟動一個C可執行檔案,起初嘗試是將在android原始碼裡面寫一個bash指令碼,然後在腳本里面執行/data目錄下的可執行檔案,然後將系統燒寫進手機,開機後將可執行檔案放入手機/data目錄裡面,然後重啟,最終的結果是沒有成功。
在系統中增加一個可喚醒中斷--同時說明platform_device &platform_driver
kernel\arch\arm\mach-exynos\setup-mu609.c #include <linux/kernel.h> #include <linux/init.h> #include <linux/platform_device.h> #inclu
NDK編譯Android上執行的C可執行程式
大部分講到NDK編譯的都是針對編譯動態靜態庫的,有些特殊的需求需要編譯成可執行檔案,所以在此記錄一下 本文基於win7 首先NDK的目錄需要加到系統路徑中去,這樣ndk-build才能正常呼叫,ndk-build本身是一個指令碼,依賴於jni資料夾,所以你的程式必須放在jn
linux系統中使C程式脫離終端執行(後臺執行)
你是否遇到過這樣的情況:從終端軟體登入遠端的Linux主機,將一堆很大的檔案壓縮為一個.tar.gz檔案,連續壓縮了半個小時還沒有完成,這時,突然你斷網了,你登入不上遠端Linux主機了,那麼前面的半個小時就會前功盡棄,你非常氣憤…… 在Linux下,如果你要執行的shel
unity3d開發的android應用中增加AD系統的詳細步驟
查看 發的 b- sset @override 大小 代碼 nac cal unity3d開發的android應用中增加AD系統的詳細步驟 博客分類: Unity3d unity3d Unity3d已經支持android,怎樣在程序裏增加admob?
android系統中如何通過程式開啟某個AccessibilityService
android系統中如何通過程式開啟某個AccessibilityService(系統輔助服務)?通常的做法是註冊AccessibilityService(輔助服務)後跳轉到設定啟動服務頁面引導使用者手動將我們建立的AccessibilityService開啟。但是很多android系統過段時間會自動將Acc
NDK編譯C可執行程式
現有這樣一個helloworld.c的原始檔,如下: #include <stdio.h> int main(){ printf("Hello world!\n"); } 如何將它進行編譯,並在Android上執行?這就是本文的目標。 原理 (如果只想
Android中增加seekbar可觸控的區域
//mCurrentView 是Seekbar的父親 private void enlargeSeekBar(){ mCurrentView.setOnTouchListener(new OnTouchListener(){ @O
C++可執行檔案自定義成linux系統服務
[Unit] Description=DimpleMarketDataConverter Service After=network.target [Service] Type=simple WorkingDirectory=/usr/local/pmcqp-dimple-converter/bin Exec
VMWARE虛擬機系統中增加新的虛擬硬盤
VMWARE虛擬機系統中增加新的虛擬硬盤VMWARE虛擬機系統中增加新的虛擬硬盤1.Vmware中增加虛擬磁盤 2.通過dmesg查看新增加硬盤的設備號啟動虛擬機,通過終端獲取新加硬盤設備的設備號 #dmesg|grep sdb(查看新添加的硬盤的設備號,一般為sdx或者hdx,通過查看容量,確認所找到的硬盤
Android系統中main.mk中關於RCS和SCCS的解釋
# this turns off the RCS / SCCS implicit rules of GNU Make % : RCS/%,v % : RCS/% % : %,v % : s.% % : S
Android系統中ls -al 資訊說明
在Android系統中我們檢視目錄下檔案資訊會用到命令 ls -al 展現出如下基本資訊. drwxrwxrwt 16 root root 680 2018-08-16 17:14 . drwxrwxrwt 16 root root 680 20
在Android系統中實現AIDL 自定義物件傳遞
今天要在《在Android系統中實現AIDL介面回撥》這篇文章的基礎上實現AIDL自定義物件的傳遞功能。還是上一篇說到的三個專案: ├── SimpleJar ├── SimpleJarClient └── SimpleJarService 一、在SimpleJar專
64位Win7系統中安裝vc++2008執行時報Error1935錯誤的解決方法
問題說明 最新單位來了一批新的計算機(64位Win7系統),其中很多計算機在安裝應用系統過程中報錯。通過對比正常使用的計算機,發現是沒有安裝vc++2008執行時,於是在網上下載了執行時並在有問題的
如何驗證Android系統中APK證書鏈的有效性
瀏覽器通過https訪問指定網址時, 需要驗證網站的證書, 瀏覽器中通常內建常用的CA(Certificate Authority)根證書,而網站的證書一般都是由根CA或者子CA簽名的.如果網站沒有這些知名CA簽名, 則需要將網站自己的根證書匯入瀏覽器才能進行h
android 系統中靜音後使得音量減鍵不能解除靜音
在以下位置做如下注釋掉其中一部分即可(最後面幾行): frameworks / base/services/core/java/com/android/server/audio/AudioService.java private void adjustStr
android系統中移動物體檢測步驟和方法
物體檢測的方法有很多,現在主流的方法有光流法、背景查分法、幀間差分法,它們各有各的優缺點;為了計算方便和同時能夠檢測 到多個物體,這裡使用的是背景差分法; 物體檢測的步驟大致可分為下面幾個部分:高斯濾波器->差值->二值化->
解除安裝Android系統中自帶的應用
一、系統應用的分類 1.系統開源應用 系統開源應用指我們可以看到原始碼的系統應用。 (1)在原始碼中的位置 2.系統未開源應用 系統未開源應用指系統中沒有該應用原始碼; (1)在原始
Android系統中通過shell命令實現wifi的連線控制
簡介 工作中遇到一個“變態”的需求,在android系統中不通過java層控制wifi的連線(主要是修改ap的essid和password),而是需要通過native層實現對wifi的控制。 How 接到這個需求時,第一個想法是如何找到Android