编译在android 平台上跑的C应用程序

Android 用的是 Bionic C, 而不是通常的glibc,因此简单使用交叉工具链并不能够编译出适合运行在android 设备上的 C/C++ 程序。

交叉工具链可以很轻松在 Android 源码 prebuilts 目录下找到,但是直接编译会提示找不到各种标准库的头文件,需要指定 Bionic C库 的 sysroot.

像 Tiny 6410 开发板带的Android toolchain 因为集成了sysroot,因此可以直接用于编译C/C++ 代码。

本文讲述如何为任何一个Android 设备(ARM v7a )使用 android 提供的NDK 工具编译代码(busybox)。

1) 下载 Android NDK 交叉工具链及 sysroot

http://developer.android.com/tools/sdk/ndk/index.html#Downloads

解压之后,在下面的路径中可以找到交叉工具链

android-ndk-r9/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86/bin

arm-linux-androideabi-addr2line*  arm-linux-androideabi-elfedit*  arm-linux-androideabi-gcc-ranlib*  arm-linux-androideabi-ld.gold*  arm-linux-androideabi-readelf*
arm-linux-androideabi-ar*         arm-linux-androideabi-g++*      arm-linux-androideabi-gcov*        arm-linux-androideabi-ld.mcld*  arm-linux-androideabi-run*
arm-linux-androideabi-as*         arm-linux-androideabi-gcc*      arm-linux-androideabi-gdb*         arm-linux-androideabi-nm*       arm-linux-androideabi-size*
arm-linux-androideabi-c++*        arm-linux-androideabi-gcc-4.8*  arm-linux-androideabi-gprof*       arm-linux-androideabi-objcopy*  arm-linux-androideabi-strings*
arm-linux-androideabi-c++filt*    arm-linux-androideabi-gcc-ar*   arm-linux-androideabi-ld*          arm-linux-androideabi-objdump*  arm-linux-androideabi-strip*
arm-linux-androideabi-cpp*        arm-linux-androideabi-gcc-nm*   arm-linux-androideabi-ld.bfd*      arm-linux-androideabi-ranlib*

最好将这个路径加入到环境变量。

android-ndk-r9/platforms/android-18/arch-arm 这个路径下面放的是 Android API18 的sysroot.

通过http://source.android.com/source/build-numbers.html#platform-code-names-versions-api-levels-and-ndk-releases 获取API 版本和android 发行版本的对应关系。

2)  编译简单的 hello world

$ cat hello.c 
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
    printf("Hello world ! \n");
    return 0;
}

$ arm-linux-androideabi-gcc -o hello --sysroot=/home/xxx/android-ndk-r9/platforms/android-18/arch-arm/ hello.c

3). 移植 busybox

$ git clone git://busybox.net/busybox.git

busybox$ cp configs/android_ndk_defconfig .config

$ make menuconfig

修改 sysroot config 到自己的路径。

$ make -j 8

$ make install

默认安装到 当前路径下的 _install/

$ adb push _install /data/busybox/

参考:

https://github.com/tias/android-busybox-ndk

That‘s all ! Enjoy your busybox on your own Android Now !

时间: 2024-10-12 08:08:38

编译在android 平台上跑的C应用程序的相关文章

[原]详解如何将cocos2dx项目编译到Android平台上的(方式一:Cywin+NDK)

链接地址:http://m.blog.csdn.net/blog/yhc13429826359/29357815 2014-6-8阅读578 评论0 前言:cocos2dx作为一个开源的移动2D游戏框架,其跨平台的特性让它备受开发公司的欢迎.这里我就不做概念性的解释了,通过这篇文章你就会了解到,它的跨平台性”是个什么样子的“---有点拟人化了 我举个比较形象的例子: 有A.B.C三个部落,A部落的语言是A和O语言,B部落的语言是B和O语言,C部落的语言是C和O语言.你作为一个外星球人你会选择去学

直播技术总结(二)ijkplayer的编译到Android平台并测试解码库

转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/55670380 前言:ijkplayer,是b站工程师开源的播放器框架,基于FFmpeg及MediaCodec,内部实现软解及硬解的功能,对于没有自研底层播放器的公司,用它确实是比较合适了.关于介绍可以直接看:https://github.com/Bilibili/ijkplayer,今天主要是对ijkplayer进行编译在Andr

Freeline - Android平台上的秒级编译方案

FreeLine是什么? Freeline是蚂蚁金服旗下一站式理财平台蚂蚁聚宝团队15年10月在Android平台上的量身定做的一个基于动态替换的编译方案,5月阿里集团内部开源,稳定性方面:完善的基线对齐,进程级别异常隔离机制.性能方面:内部采用了类似Facebook的开源工具buck的多工程多任务并发思想:端口扫描,代码扫描,并发编译,并发dx,并发merge dex等策略,在多核机器上有明显加速效果,另外在class及dex,resources层面作了相应缓存策略,做到真正增量开发,另外引入

在Android平台上编译faad2

1.从官网下载源码 2.编辑一个config.h: /* config.h. Generated from config.h.in by configure. */ /* config.h.in. Generated from configure.in by autoheader. */ /* Define if you want to use libfaad together with Digital Radio Mondiale (DRM) */ /* #undef DRM */ /* De

Android平台上抓包

经常会有一些测试需求比如:测试手机上某个app的网络通信是否已经加密,或者测试某个app是否偷偷链接某些网站. 根据抓包的对象,主要有两种途径: 1. 在路由器端抓包:使用一台已经连入路由器的PC来抓取路由器上所有的数据传输信息. 2. 在终端抓包:在终端(手机,平板等)上抓取次终端设备的网络传输信息. 注意:可以很容易通过网络下载到很多可以用来抓包的apk,但是前提是android手机或者终端要root过,笔者试过其中的一.二款,感觉不够理想. 其实网上的这些工具也都是使用tcpdump这款命

Android平台上最好的几款免费的代码编辑器

使用正确的开发工具能够快速有效地完成源代码的编写和测试,使编程事半功倍.在网络信息高速发展的今天,移动设备的方便快捷已经深入人心,越来越多的程序员会选择在任何感觉舒适的地方使用移动设备查看或者编辑源代码.于是,Android平台上大量基于代码编程的应运而生,谷歌应用商店里的代码编辑器.编译器和开发环境比比皆是.由于不同的工具特性和缺点不尽相同,因此如何选择一款最适合自己的开发工具便成了一件头疼的事情.在这里,我们列出了Android平台上5款最好的代码编辑器来帮助你作出选择. 1. Quoda

如何在android平台上使用js直接调用Java方法[转]

转载自:http://www.cocos.com/docs/html5/v3/reflection/zh.html #如何在android平台上使用js直接调用Java方法 在cocos2d-js 3.0beta中加入了一个新特性,在android平台上我们可以通过反射直接在js中调用java的静态方法.它的使用方法很简单: var o = jsb.reflection.callStaticMethod(className, methodName, methodSignature, parame

【cocos2d-js官方文档】二十四、如何在android平台上使用js直接调用Java方法

在cocos2d-js 3.0beta中加入了一个新特性,在android平台上我们可以通过反射直接在js中调用java的静态方法.它的使用方法很简单: var o = jsb.reflection.callStaticMethod(className, methodName, methodSignature, parameters...) 在callStaticMethod方法中,我们通过传入Java的类名,方法名,方法签名,参数就可以直接调用Java的静态方法,并且可以获得Java方法的返回

Android平台上关于IM的实践总结

前言 IM通信在互联网发展到现在已经是码农的世界里人尽皆知的技术,特别在当下移动互联网迅猛发展的时代这种技术的开发也更加火热,其中老牌的代表作就有QQ和MSN,和最近新崛起的微信,默默,易信,来往等眼花缭乱的各种应用都把IM技术应用其中.我是Android开发人员,写这篇文章主要原因也是因为我自己从事开发以来主要做过的几款APP都是包含着IM通信,在不断的摸爬滚打的解决问题的过程中,积累了一些经验记录便将其记录到博客中作为自己一个阶段性的总结,也可以分享其他需要的开发者,作为一种参考实践的方案,