這個其實就是個人的一個小小的興趣,用C/C++寫一個小程序放在Android的系統中,然後用Java寫一個Android的UI程序來調用這個C/C++的程序。這裏總結了實現這個功能的一些步驟和遇到的問題。蠻有意思的。
這裏參考了下面兩篇博文,主要是關於搭建arm-linux-gcc交叉編譯環境的,非常有幫助,感謝他們的分享。
http://blog.csdn.net/super005/article/details/6369577
http://mawenhao19930620.blog.163.com/blog/static/128575361201212211291763/
http://www.cnblogs.com/huaping-audio/archive/2009/08/27/1555089.html
這裏主要分四步:
1)搭建一個交叉編譯環境,這裏用的是Ubuntu的虛擬機來編譯出一個可以在Android系統上運行的二進制文件;
2) 寫一個 hello.c 的測試用的C程序 ,並且把它編譯成可執行文件;
3)把可執行文件上傳到Android系統中,及一些注意事項。
4)寫一個Java的UI程序來調用這個測試的C程序。
第一步 搭建壞境
主要參考了上面兩個鏈接中的文章,簡單而非常有幫助。
這裏需要交叉編譯的主要原因是Android系統源於Linux但不同於Linux,Linux上的程序無法直接在Android上運行。需要重新編譯才行。Android設備主要基於 ARM的,在PC上的程序基於的X86的結構,這也導致了Linux下的程序必須重新編譯才能在Android下運行。
在兩篇文章中都提到了使用一個編譯工具
arm-none-linux-gnueabi
一個使用的是 2009 版本的,一個是2008版本的。
配置方式都是把目標壓縮文件Copy到一Linux的系統上,然後解壓縮,設置PATH,
使用arm-none-linux-gnueabi-gcc 命令編譯程序。
這裏保存一下兩個工具的下載地址
arm-2010.09-50-arm-none-linux-gnueabi
arm-2008q3-41-arm-none-linux-gnueabi
在Linux配置 PATH的方法 (Ubuntu)
1) su nano ~/.bashrc
2) 在文件末尾添加如下的一行
export PATH=$PATH:/... .../... .../arm-2010.09-50/bin
3) 保存文件並退出
4) 運行命令 source ~/.bashrc
5) 當然可以用命令行驗證一下是否成功 arm-none-linux-gnueabi-gcc --version。
第二步 編譯C程序
寫一個簡單的HelloWorld.c 的程序(最愛)。
使用命令 arm-none-linux-gnueabi-gcc -static HelloWorld.c -o HelloWorld
這裏注意使用 -static 選項,測試時我沒有使用這個參數,結果編譯出來的程序在Android系統中是沒法運行的。
第三步 上傳C的可執行文件
把編譯好的HelloWorld程序使用 adb push 上傳的一個Android系統中。這裏測試時使用的是一個Android虛擬機,其中虛擬了一個 256M的sdcard。這裏把程序先上傳到sdcard有一個好處是基本不會失敗。
上傳程序後當然可以嘗試着在Android Shell 中運行編譯好的程序。
1) 使用 adb shell, 進入Android 的命令行。
2) cd /mnt/sdcard 進入HelloWorld的存儲位置。
3) ./HelloWorld 執行程序,
但如果嘗試在sdcard 中運行程序多半會遇到一個Permision Denied一個錯誤。
我們可以簡單嘗試使用 chmod 777 HelloWorld來修復它,但再次運行程序時多半還會失敗。
網上找了找原因,給出的解釋是Android不能修改 sdcard下 程序的權限,最簡單的老老實實把它複製到Android系統下的某個文件夾下吧。
4) cp /mnt/sdcard/HelloWorld /data/ 複製文件到Android的data目錄下
5) chmod 777 HelloWorld 修改權限
6) ls -l 當然可以在查詢一下,但也不是必須的。
7) ./HelloWorld 運行程序
這時基本已經可以了。
如果交叉編譯出來的程序不正確在這裏是沒法運行的,出現 error: magic 7F45 基本上就是交叉編譯出的問題了。
第四步 使用Java 開發 UI
程序實例:
MainActivity.java
CMDExecute,java
運行結果: