1. 程式人生 > >Android 執行 C/C++程式 (使用 arm-linux-gcc 交叉編譯環境)

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  執行程式

這時基本已經可以了。

picture_1

如果交叉編譯出來的程式不正確在這裡是沒法執行的,出現 error:  magic 7F45  基本上就是交叉編譯出的問題了。

picture_err

第四步  使用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;    	
    }
}


執行結果: 

pic_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