如何让这个C程序可以在android 让线程等待上运行?

&&最后修改于
请各位遵纪守法并注意语言文明Android设备上的应用程序大都是用java语言编写的,但有时我们需要用C语言进行一些底层的开发,但我们一般的PC机CPU都是Intel&x86架构,而大多数移动设备CPU都是ARM架构,因此在Linux上编译运行的可执行程序是不能直接在Android手机上运行的,但是我们可以在PC机上交叉编译出能在ARM平台下运行的程序。
1.安装交叉编译工具
首先,我们需要在Linux下安装 arm-none-linux-gnueabi-gcc&交叉编译工具链(找了好久~_~)
不多说了,放到usr/local/bin目录下,解压文件包,解压后得到一个arm-2009q1文件夹,然后把arm-2009q1下的bin目录配进环境变量
如果在终端下执行arm-none-linux-gnueabi-gcc -v可以成功的话,就说明配置成功了,如图
2.编译C程序
接着我们就可以写C语言程序并且编译了,随便写一个HelloWorld程序
#include &stdio.h&
int main()
printf(&Hello world!\n&);
然后用arm-none-linux-gnueabi-gcc编译(其实下面的编译命令有问题,具体后面再说)
arm-none-linux-gnueabi-gcc test.c -o test
3.赋予可执行权限
然后,把可执行文件拷贝到手机sdcard中
尝试运行一下test,结果Permission&denied
明明有执行权限呀,后来得知原因是sdcard目录下是不可以执行程序的,而在根目录的/data/local目录下是可以执行的
先获得管理员权限,这样才能读写根目录
将程序cat到指定的目录中
cat test & /data/local/test
这时还只有读写权限,我们要添加可执行权限
chmod 777 test
再次尝试执行
结果是No&such&file&or&directory!
后来经过借鉴网友的经验,发现这个是因为我们的程序使用的是动态链接方式编译的,而Android和Ubuntu的链接库文件路径不同,导致找不到文件
可以用gcc&-static命令改用静态链接的方式编译
arm-none-linux-gnueabi-gcc test.c -o test -static
静态链接后程序大了不少,再重复上述步骤,终于可以成功运行了,Hello&world!

本文已收录于以下专栏:
相关文章推荐
继续 NDK 的开发。上次我们的实例中,对 C 应用程序的编译链接,自己编写的makefile 是件比较困难的事情。虽然最后成功了,不过中间经历了不少坎坷。我们现在研究下如何用 NDK 提供的 bui...
android手机可以运行C/C++可执行程序
具体运行使通过adb将可执行文件通过adb push命令上传到Android手机上
adb push elf_file /data/push_fil...
基本概念:
adb:android debug bridge,调试桥。
准备工作:
先写一段c语言代码,再把c语言的二进制文件下载到android设备中去,然后在ubuntu终端中直接运...
1. 在./development目录下创建一目录 如:hello
2. 进入hello目录,在其下编写自己的.c文件,如: hello.c
int mai...
在android的设计中,谷歌设计了一套专门为嵌入式设备使用的bionic C库,以替换原有的GUN Libc,这个精简的bionic库据说只有200多K,所以如果只想使用这个精简的C库像在linux...
Android编译环境本身比较复杂,且不像普通的编译环境:只有顶层目录下才有Makefile文件,而其他的每个component都使用统一标准Android.mk. Android.mk文件本身是比较...
本文转载自:杂谈——Android从启动到程序运行发生的事情
好久没有写博客了,瞬间感觉好多学了的东西不进行一个自我的总结与消化总归变不成自己的。通过博客可能还可以找到一些当初在学习的时...
1Android是基于Linux的一个操作系统,它可以分为五层,下面是它的层次架构图,可以记一下,因为后面应该会总结到SystemServer这些Application Framework层的东西
转载请注明出处
博客地址:http://blog.csdn.net/JonsTank2013/article/details/
作者:李中权
好久没有写博客了...
他的最新文章
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
白手起家, 积分 8, 距离下一级还需 192 积分
论坛徽章:0
qt写的android程序,点击界面上的按钮,让程序去后台运行,如何实现?急急急。。。。。
白手起家, 积分 8, 距离下一级还需 192 积分
论坛徽章:0
白手起家, 积分 8, 距离下一级还需 192 积分
论坛徽章:0
qt写的android程序,点击界面上的按钮,让程序去后台运行,如何实现?急急急。。。。。
qt写的android程序如何调用android写的程序?急急急。。。。。。
北京盛拓优讯信息技术有限公司. 版权所有 京ICP备号 北京市公安局海淀分局网监中心备案编号:22
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处这个其实就是个人的一个小小的兴趣,用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-/bin
3) &保存文件并退出
4) &运行命令 source ~/.bashrc
5) &当然可以用命令行验证一下是否成功 &arm-none-linux-gnueabi-gcc &--version。
第二步 &编译C程序
写一个简单的HelloWorld.c 的程序(最爱)。
#include &stdio.h&
int main()
printf(&hi ym012 %d/n&,i);
使用命令 &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.
import java.io.IOE
import android.os.B
import android.app.A
import android.app.AlertD
import android.content.I
import android.view.V
import android.widget.B
public class MainActivity extends Activity
private Button btnRunH
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()
public void onClick(View arg0)
CMDExecute m_Executor = new CMDExecute();
String m_strResult = &&;
String arg[] = {&/data/hello&};
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)
CMDExecute,java
package com.example.
import java.io.F
import java.io.IOE
import java.io.InputS
public class CMDExecute
public synchronized String run(String[] cmd, String workdirectory) throws IOException
String result = &&;
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();
运行结果:&
本文已收录于以下专栏:
相关文章推荐
安装要求:
1、一个android平台(模拟器、平板电脑、手机都可以,本人只有手机,所以只能按手机android平台来写)
2、系统上需要安装有终端模拟器(推荐用bash,毕竟习惯linux了)
...
android安装shell并配置好gcc就可以在手机上进行编程,Linux爱好者又经常一大堆水课的盆友必备哦~
android安装了ssh服务端并配置好ssh终端,这样也可以通过电脑或者其他手机(a...
android 编译纯C程序,然后push到手机上运行。
GCC编译器介绍GCC编译器(GNG C Compiler)是GNU项目中符合ANSI C标准的编译系统,能够编译C
Object C等语言编写的程序,同时GCC也是一个交叉编译器,特别使...
Decheng (Robbie) Fan
I wanted to install GCC (GNU Compiler Collection) on my Android ph...
时间过得很快,转眼之间已经到新公司一个月了。
前几天帮忙师兄发现的Android上的一个驱动程序漏洞,奈何技术不够耐心不足,没有找到漏洞的根源。由于程序要由c程序来触发,而c程序是在pc上的开发的,要在Android设备上运行,这就涉及到交叉编译...
一、基本概念
在windows平台和linux平台下都大量存在着库。
本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。
由于windows和linux的平台不同...
C++提供了C 连接交换指定符号extern“C”来解决名字匹配问题。
为什么使用ullib有时会出现 undefined reference error 的错误?
为什么在动态链接库里ul_log会把日志输出到屏幕上?
为什么用-static 编译有时候会报...
他的最新文章
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)}

我要回帖

更多关于 android 让图片旋转 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信