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 !

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

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

    链接地址:http://m.blog.csdn.net/blog/yhc13429826359/29357815 2014-6-8阅读578 评论0 前言:cocos2dx作为一个开源的移动2D游戏框 ...

  2. 让“是男人就下到100层”在Android平台上跑起来

    原工程:https://github.com/jeekun/DownFloors 移植后的代码:HelloCpp.zip 移植后的APK:HelloCpp.apk 说明:(cocos2d-x版本是“ ...

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

    使用正确的开发工具能够快速有效地完成源代码的编写和测试,使编程事半功倍.在网络信息高速发展的今天,移动设备的方便快捷已经深入人心,越来越多的程序员会选择在任何感觉舒适的地方使用移动设备查看或者编辑源代 ...

  4. Mac系统下编译支持Android平台的最新X264编码器

    Mac系统下编译支持Android平台的最新X264编码器 原文来自 http://www.mingjianhua.com,转载请注明出处 1.首先去官网下载最新的x264源代码,解压到任意目录 ht ...

  5. Qt在Android平台上实现html转PDF的功能

    Qt for Android Qt for Android enables you to run Qt 5 applications Android devices. All Qt modules ( ...

  6. 随笔之Android平台上的进程调度探讨

    http://blog.csdn.net/innost/article/details/6940136 随笔之Android平台上的进程调度探讨 一由来 最近在翻阅MediaProvider的时候,突 ...

  7. (转) Android平台上关于IM的实践总结

    前言 IM通信在互联网发展到现在已经是码农的世界里人尽皆知的技术,特别在当下移动互联网迅猛发展的时代这种技术的开发也更加火热,其中老牌的代表作就有QQ和MSN,和最近新崛起的微信,默默,易信,来往等眼 ...

  8. OpenCV在Android平台上的应用

    今年8月份, OpenCV 2.3.1发布了. 虽然从2.2开始, OpenCV就号称支持Android平台, 但真正能让OpenCV在Android上运行起来还是在2.3.1版本上. 在这个版本上, ...

  9. unity3D开发的程序发布到Android平台上进行运行测试的详细步骤

    第一步    下载安装JDK 和SDK 1.需要配置java环境.点击链接进入ava的配置的方法:http://www.cnblogs.com/Study088/p/7496158.html 2.下载 ...

随机推荐

  1. Android Studio 中提示 Private field 'mType' is assigned but never accessed 的原因

    Android Studio 是个很酷的编译器,之前发现有个代码提示很奇怪,但无奈一直没看懂他的意思,不过也没报错就没太在意,刚刚突然领悟了,原来是自己代码不规范. Private field 'mT ...

  2. java 内省

    用内省来操作Bean会给程序带来很大的便利,特别是在很大的实体对象的时候,在其属性很多的时候要为其赋值的时候, package com.bean; public class User { privat ...

  3. openwrt下关于snmpd的一些信息

    cd /tmp/ 上传: tftp -gr libnetsnmp_5.4.4-1_ar71xx.ipk 192.168.11.56 安装: opkg install libnetsnmp_5.4.4- ...

  4. webapi中的路由约束

    Route Constraints Route constraints let you restrict how the parameters in the route template are ma ...

  5. UVALive 6672 Bonus Cards 概率dp

    题意呢 就是有两种售票方式 一种是icpc 一种是其他方式 icpc抢票成功的概率是其他方式的2倍…… 这时 一个人出现了 他通过内幕知道了两种抢票方式各有多少人 他想知道自己如果用icpc抢票成功的 ...

  6. Spring 中,对象销毁前执行某些处理的方法

    通过 @PreDestroy 和 bean 中配置 destroy-method 实现该功能 java 代码中: 1: public class TestClass { 2: private Sche ...

  7. 找斐波那契数列中的第N个数——递归与函数自调用算法

    题目描述 Description 用递归的方法求斐波那契数列中的第N个数 输入输出格式 Input/output 输入格式:一行,一个正整数n输出格式: 一行,一个数,表示斐波那契数列中的第N个数  ...

  8. kvstore之mongodb为存储介质

    配置config(连接mongo) mongo define('KVSTORE_STORAGE', 'base_kvstore_mongodb'); define('MONGODB_SERVER_CO ...

  9. js 技巧

    用于浮窗跳转至父窗口 parent.document.location.href='/xxx/xxx.htm'; 取父窗口的元素 window.parent.$('#xxx'); 正常跳转 windo ...

  10. js深入理解构造函数和原型对象

    1.在典型的oop的语言中,如java,都存在类的概念,类就是对象的模板,对象就是类的实例.但在js中不存在类的概念,js不是基于类,而是通过构造函数(constructor)和原型链(propoty ...