Android 執行 C/C++程式 (使用 arm-linux-gcc 交叉編譯環境)
這個其實就是個人的一個小小的興趣,用C/C++寫一個小程式放在Android的系統中,然後用Java寫一個Android的UI程式來呼叫這個C/C++的程式。這裡總結了實現這個功能的一些步驟和遇到的問題。蠻有意思的。
這裡參考了下面兩篇博文,主要是關於搭建arm-linux-gcc交叉編譯環境的,非常有幫助,感謝他們的分享。
這裡主要分四步:
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 命令編譯程式。
這裡儲存一下兩個工具的下載地址
在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 的程式(最愛)。
#include <stdio.h>
int main()
{
int i=0;
printf("hi ym012 %d/n",i);
return;
}
使用命令 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
能在Android系統下把編譯好的C程式執行起來基本已經完成了 90%了,這裡使用Java 寫一個Android的 UI 只是為了讓程式更好玩一些。 這裡主要使用的是 Progress 和 ProgressBuilder 的Java 的類庫。程式例項:
MainActivity.java
package com.example.systeminformation;
import java.io.IOException;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity
{
private Button btnRunHello;
private Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnRunHello = (Button) findViewById(R.id.id_run_hello);
btnRunHello.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View arg0)
{
CMDExecute m_Executor = new CMDExecute();
String m_strResult = "";
String arg[] = {"/data/hello"};
try
{
m_strResult = m_Executor.run(arg, "/data");
}
catch (IOException e)
{
e.printStackTrace();
}
new AlertDialog.Builder(MainActivity.this)
.setTitle("Run Hello")
.setMessage(m_strResult)
.setPositiveButton("確定", null)
.show();
}
});
}
}
CMDExecute,java
package com.example.systeminformation;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
public class CMDExecute
{
public synchronized String run(String[] cmd, String workdirectory) throws IOException
{
String result = "";
try
{
ProcessBuilder builder = new ProcessBuilder(cmd);
if (workdirectory != null)
{
builder.directory(new File(workdirectory));
builder.redirectErrorStream(true);
Process process = builder.start();
InputStream in = process.getInputStream();
byte[] re = new byte[1024];
while (in.read(re) != -1)
{
System.out.println(new String (re));
result = result + new String(re);
}
in.close();
}
}
catch(Exception ex)
{
ex.printStackTrace();
}
return result;
}
}
執行結果:
相關推薦
Android 執行 C/C++程式 (使用 arm-linux-gcc 交叉編譯環境)
這個其實就是個人的一個小小的興趣,用C/C++寫一個小程式放在Android的系統中,然後用Java寫一個Android的UI程式來呼叫這個C/C++的程式。這裡總結了實現這個功能的一些步驟和遇到的問題。蠻有意思的。 這裡參考了下面兩篇博文,主要是關於搭建arm-lin
Ubuntu14.04下arm-linux-gcc交叉編譯環境搭建
Ubuntu下arm-linux-gcc交叉編譯環境搭建 系統:Ubuntu 14.04 32bit 1、網上下載 arm-linux-gcc-4.4.3.tar.gz 2、解壓
Ubuntu16.04下arm-linux-gcc交叉編譯環境搭建
Ubuntu下arm-Linux-gcc交叉編譯環境搭建 參考:http://blog.csdn.net/hebbely/article/details/53992805 1、網上下載 arm-
安裝arm-linux-gcc交叉編譯環境
步驟: 1.下載並安裝arm-linux-gcc arm-linux-gcc-4.2.1的版本在http://ftp.snapgear.org/pub/snapgear/tools/arm-linu
Ubuntu系統下arm-linux-gcc交叉編譯環境搭建過程
搭建所需環境 Linux版本:Ubuntu 14.10 交叉編譯器版本:arm-linux-gcc-4.4.3資源連結 何為交叉編譯環境 搭建交叉編譯環境,即安裝、配置交叉編譯工具鏈。在Ubun
vmware虛擬機器上Redhat作業系統安裝arm-linux-gcc交叉編譯環境
1、下載檔案: 安裝包:arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz 下載地址 http://pan.baidu.com/s/1i31c3Kp 2、開始安裝(建議大家新建一個資料夾,例如:ARM),然後將檔案複製到新建的資料夾中
Ubuntu下Arm-Linux-GCC交叉編譯環境的搭建
1.下載arm-linux-gcc-3.4.1.tar.bz2到臨時的目錄下。 2.解壓 arm-linux-gcc-3.4.1.tar.bz2 #tar -jxvf arm-linux-gcc-3.4.1.tar.bz2 解壓過程需要一段時間,解壓後的檔案形成
cmake 配置arm-linux-gcc 交叉編譯環境
If cmake(1) is invoked with the command line parameter-DCMAKE_TOOLCHAIN_FILE=path/to/file, the fi
Ubuntu18.04安裝arm-linux-gcc交叉編譯工具(附arm-linux-gcc 5.4.0包)
一、下載arm-linux-gcc 5.4.0包 下載(百度雲)連結:https://pan.baidu.com/s/1AeqzkboWkJDJjU9HxtXhrA 提取碼:uzup ------------------------------------------
Ubuntu 16.04 安裝arm-linux-gcc交叉編譯
方法一: 使用如下命令進行arm-linux-gcc的安裝: sudo apt-get install gcc-arm-linux-gnueabihf 使用如下命令進行arm-linux-g++的安裝: sudo apt-get install g++-arm-linux-gnuea
用arm-linux-gcc交叉編譯 openssl zlib curl
參考了大牛文章: 準備工作: 1. ubuntu 系統 2. 下載 arm-linux-gcc-4.3.2.tgz 放到 /opt cd /opt wget http://www.arm123.com.cn/linux/arm-linux-gcc-4.3.2.tgz
arm-linux-gcc交叉編譯工具鏈過程!
一、首先去網站下載交叉編譯包比如:arm-linux-gcc-4.3.2.tar.bz2等等 二、把檔案通過虛擬機器安裝的tool工具後共享到虛擬機器的linux裡面,存放在/mnt/hgfs底下 三、把該壓縮包複製或者移動到/home目錄底下進行操作(切記在共享目
arm-linux-gcc 交叉編譯工具鏈安裝
1. 解壓arm-linux-gcc x.x.x 2.拷貝到你要儲存的路徑 也可以在第1步中 加-C引數指定解壓到的路徑 參照別人的做法我把它放到/usr/local/toolchain下面 3.要
[Mini2440 - 008] 安裝 arm-linux-gcc 交叉編譯器
加載 pan bz2 bash 單個 ubun 提示 owb 下載 一、相關資料獲取 我個人在學習 mini2440 開發板時是跟著韋東山老師的第一期視頻學習的,視頻和資料我稍作修改了一下,只是改變了一下文件組織結構。資料獲取請訪問百度雲鏈接。 鏈接:http://
ubunutu16.4 64位安裝arm-linux-gcc交叉編譯器
網上有很多的安裝交叉編譯的方法,但是照做後,發現arm-linux-gcc發現提示 那麼怎麼處理呢? 接下來一步步記錄下吧! 這裡是使用的是arm-linux-gcc-4.5.1在友善之壁官網可以下載。 1:將arm-linux-gcc-4.5.1-v6-vf
debian9安裝arm-linux-gcc交叉編譯器,並安裝windows和linuxs共享檔案的samba伺服器
1,首先下載arm-linux-gcc安裝包,http://arm9.net/download.asp 解壓:tar -zxvf *.tar.gz 2,修改環境,使得系統能夠識別arm-linux-gcc, 方法1:##sudo vi /etc/environment 方
RedHat9.0下 arm-linux-gcc交叉編譯器的安裝、生效、查詢
1. 安裝標準的C開發環境,由於Linux安裝預設是不安裝的,所以需要先安裝一下(如果已經安裝好的話,就可以免去這一步了): #sudo apt-get install gcc g++ libgcc1 libg++ make gdb 2. 下載arm-linux-gcc-3.4.1
ubantu 安裝arm-linux-gcc交叉編譯器找不到命令問題
1、首先配置環境變數sudo gedit /etc/environment sudo gedit ~/.bashrc 2、配置好環境變數 重啟pc 或者輸入 sudo source ~/.bashr
CMake設定arm-linux-gcc交叉編譯器
http://blog.sina.com.cn/s/blog_627bb2cf0101ge3r.html主機:Ubuntu10.04 交叉編譯器:EABI-4.3.3 CMake在ubuntu系統下預設使用系統的gcc、g++編譯器,編譯arm下的程式要使用arm-linux
arm-linux-gnueabihf 交叉編譯
1:下載 arm-linux-gnueabihf 下載地址: https://launchpad.net/linaro-toolchain-binaries/trunk/2013.10/+download/gcc-linaro-arm-linux-gnueabihf-4.8-2013.1