1. 程式人生 > >在Android 系統中增加C 可執行程式來訪問硬體驅動程式

在Android 系統中增加C 可執行程式來訪問硬體驅動程式

Android 系統中增加C 可執行程式來訪問硬體驅動程式。

核心驅動程式。在這個名為helloLinux 核心驅動程式中,建立三個不同的檔案節點來供使用者空間訪問,分別是傳統的裝置

檔案/dev/helloproc 系統檔案/proc/hellodevfs 系統屬性檔案/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 語言編寫的可執行程式吧。

. 參照在Ubuntu 上為Android系統編寫Linux 核心驅動程式一文,準備好Linux 驅動程式。使用Android 模擬器載入

包含這個Linux 驅動程式的核心檔案,並且使用adb shell 命令連線上模擬,驗證在/dev 目錄中存在裝置檔案hello

. 進入到Android

原始碼工程的external 目錄,建立hello 目錄:

[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