1. 程式人生 > >Android:如何交叉編譯要在安卓板上執行的C程式

Android:如何交叉編譯要在安卓板上執行的C程式

  • 交叉編譯在安卓板上執行的C程式

寫給一直在做linux下驅動或應用開發的小夥伴們,這裡描述了在安卓開發板中,如何編寫,編譯,生成可執行的C程式,並在安卓真機中測試的一整套基本操作流程.

  • 新建C專案

在你的安卓原始碼目錄下新建一個資料夾用來存放你的工程程式碼,譬如我的安卓原始碼目錄為"/root/sc60-android/google_android7.1.2",在此目錄下我新建了一個資料夾"lingump",並建立兩個檔案"Android.mk"和"hello_lingump.c".

"Android.mk":

關於這種風格的Makefile這裡先不做說明,不過很簡單,並且這個Makefile一般滿足所有這種除錯用的C工程了,它非常簡單,因為它是在我們的安卓原始碼目錄中使用的.

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello_lingump 
LOCAL_SRC_FILES := hello_lingump.c

include $(BUILD_EXECUTABLE)

"hello_lingump.c":

#include <stdio.h> 
int main()
{
	printf("hello lingump\n");
	return 0;
}                 
  • 編譯C專案

直接在安卓原始碼根目錄下執行命令"make hello_lingump",編譯你的目標模組,如果你跟我一樣,之前編譯過安卓原始碼,然後只是做了一點修改(如同第一步所述的修改),那麼在編譯完成的最後你會看到類似如下資訊:

[100% 6/6] Install: out/target/product/msm8953_64/system/bin/hello_lingump

這說明我們成功的生成了可執行程式在如上位置,如果我們是重新打包的安卓系統映象檔案的話,那麼在檔案系統的"/system/bin/"路徑下應該就會有"hello_lingump"可執行程式,這裡沒有嘗試,不過按照安卓打包映象的做法應該是這樣的,這裡我們不打包進映象,因為每每除錯一個程式就得重新打包映象,更新映象是非常麻煩的.我們這裡僅僅是一個測試階段的執行程式,非開發階段的話可以考慮直接打包進映象,接下來就用到了adb.

  • "燒錄"並測試

這裡的燒錄是指通過adb工具,將電腦中的可執行程式放到安卓版中,關於如何安裝adb等內容這裡不再說明,假設連線等一系列準備工作已經做好了,接下來我們通過命令列檢視裝置連線狀態,通過"adb devices"可以檢視當前連線的裝置,如果連線上了,執行"adb shell"命令可以直接進入命令列,然後我們輸入"exit"命令可以退出命令列,因為接下來我們要在電腦中使用adb往安卓板中傳送檔案,而不是進入安卓命令列中操作,這裡我的命令如下:

adb push E:/WindowsShare/hello_lingump /system

注意這裡,我的adb是安裝在Windows7系統中的,而之前編譯生成的"hello_lingump"檔案以及我的安卓原始碼都是在虛擬機器中Ubuntu14.04的,所以這裡我是把改程式拷出來後再用的adb,不過Ubuntu中也可以使用adb的,囉嗦一下.

這裡我是想把我電腦中的"E:/WindowsShare/hello_lingump"檔案傳送到安卓板中的"/system"路徑下,但是結果卻發現要麼沒有許可權操作,要麼安卓板中的路徑是個只讀路徑,那怎麼辦?網上有人說可以放到"/data/local/"路徑下,我嘗試過不行,並且我查看了所有的路徑的許可權,都是不允許這些操作的,然後嘗試通過進入安卓命令列修改路徑的許可權等也是不可行的,除非在安卓原始碼中對安卓映象做手腳,讓它支援可讀可寫或者許可權拉滿,當然也沒必要那麼麻煩,只要你的安卓系統是root過得,那麼我們直接可以通過adb嘗試:

adb root
adb shell "mount -o rw,remount /system"

如果執行以上三步,沒有任何錯誤資訊就說明成功了,這個時候可以通過"adb shell"命令進入安卓系統中再用"mount"命令檢視掛載的檔案系統"/system",會發現它是可讀可寫的了,至此,我們再重新嘗試之前的傳送命令,就會成功了,然後我們進入安卓命令列,執行"/system/hello_lingump"命令,發現:

hello lingump

至此,完整的一個流程就結束了,更多涉及到的adb使用以及安卓系統中的C應用程式設計,大家再去自行尋找資料學習吧,相信懂Linux下驅動開發或者應用程式設計的朋友不難發現,其實對比起來大同小異,不過我第一次不瞭解安卓的時候也不得方法,這裡做一個小的歸納總結,願幫助到新的朋友.