1.配置环境变量
添加make工具path环境变量:

E:\Android\android-ndk-r10b\prebuilt\windows-x86_64\bin

 
 
2.编写Hello World
新建hello.c
#include <stdio.h>

int main(int argc, char* argv[])
{
printf("Hello Android!\r\n");
return ;
}
3.编写makefile文件如下
#ndk根目录
NDK_ROOT=E:\Android\android-ndk-r10b #编译器根目录
TOOLCHAINS_ROOT=$(NDK_ROOT)/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64 #编译器目录
TOOLCHAINS_PREFIX=$(TOOLCHAINS_ROOT)/bin/arm-linux-androideabi #头文件搜索路径
TOOLCHAINS_INCLUDE=$(TOOLCHAINS_ROOT)/lib/gcc/arm-linux-androideabi/4.6/include-fixed #SDK根目录
PLATFROM_ROOT=$(NDK_ROOT)/platforms/android-/arch-arm #sdk头文件搜索路径
PLATFROM_INCLUDE=$(PLATFROM_ROOT)/usr/include #sdk库文件搜索路径
PLATFROM_LIB=$(PLATFROM_ROOT)/usr/lib #文件名称
MODALE_NAME=hello #删除
RM=del #编译选项
FLAGS=-I$(TOOLCHAINS_INCLUDE) \
-I$(PLATFROM_INCLUDE) \
-L$(PLATFROM_LIB) \
-nostdlib \
-lgcc \
-Bdynamic \
-lc #所有obj文件
OBJS=$(MODALE_NAME).o \
$(PLATFROM_LIB)/crtbegin_dynamic.o \
$(PLATFROM_LIB)/crtend_android.o #编译器链接
all:
$(TOOLCHAINS_PREFIX)-gcc $(FLAGS) -c $(MODALE_NAME).c -o $(MODALE_NAME).o
$(TOOLCHAINS_PREFIX)-gcc $(FLAGS) $(OBJS) -o $(MODALE_NAME) #删除所有.o文件
clean:
$(RM) *.o #安装程序到手机
install:
adb push $(MODALE_NAME) /data/local/tmp
adb shell chmod /data/local/tmp/$(MODALE_NAME)
adb shell /data/local/tmp/$(MODALE_NAME) #运行程序
run:
adb shell /data/local/tmp/$(MODALE_NAME)
 
 
4. 使用make命令便可以编译程序
 
生成一个可以执行文件hello   一个目标文件hello.o
 
于是有编译NDK的命令:
// 编译目标文件
E:\Android\android-ndk-r10b/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/bin/arm-linux-androideabi-gcc -IE:\Android\android-ndk-r10b/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/lib/gcc/arm-linux-androideabi/4.6/include-fixed -IE:\Android\android-ndk-r10b/platforms/android-/arch-arm/usr/include -LE:\Android\android-ndk-r10b/platforms/android-/arch-arm/usr/lib -nostdlib -lgcc -Bdynamic -lc -c hello.c -o hello.o // 编译可以执行文件
E:\Android\android-ndk-r10b/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/bin/arm-linux-androideabi-gcc -IE:\Android\android-ndk-r10b/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/lib/gcc/arm-linux-androideabi/4.6/include-fixed -IE:\Android\android-ndk-r10b/platforms/android-/arch-arm/usr/include -LE:\Android\android-ndk-r10b/platforms/android-/arch-arm/usr/lib -nostdlib -lgcc -Bdynamic -lc hello.o E:\Android\android-ndk-r10b/platforms/android-/arch-arm/usr/lib/crtbegin_dynamic.o E:\Android\android-ndk-r10b/platforms/android-/arch-arm/usr/lib/crtend_android.o -o hello
 
5.运行程序
同样使用makefile即可
 
使用make install即可安装运行我们的程序
使用make run即可运行我们的程序
 
install和run 在makefile可以理解成自定义函数

我擦 为知笔记的代码着色到博客园不能用了

NDK学习三: 纯手工编译Hello World的更多相关文章

  1. ndk学习8: 编译动态库

    目录: 手工编译动态库 ndk-build编译动态库(Eclipse环境)   手工编译静态库 老规矩还是先手工操作,知其然并知其所以然   需要用到的核心命令: gcc -g -c -fpic -W ...

  2. APUE学习--第三版apue编译

    第三版apue编译:     1. 首先在  http://www.apuebook.com/   下载源码解压:      tar zxvf src.3e.tar.gz 看完Readme可知,直接执 ...

  3. 纯手工编写的PE可执行程序

    [文章标题]: 纯手工编写的PE可执行程序[文章作者]: Kinney[下载地址]: 自己搜索下载[使用工具]: C32[操作平台]: win 7[作者声明]: 只是感兴趣,没有其他目的.失误之处敬请 ...

  4. 【纯手工】整理豆瓣热点推荐列表-财经&自我管理

    [纯手工]整理豆瓣热点推荐列表-财经&自我管理  简七君 2013-10-27 09:40:06     豆瓣君的首页热点推荐实在难以捉摸,只有正好跳出推荐贴时才能按图索骥找列表.简七和小伙伴 ...

  5. 纯手工打造漂亮的瀑布流,五大插件一个都不少Bootstrap+jQuery+Masonry+imagesLoaded+Lightbox!

    前两天写的文章<纯手工打造漂亮的垂直时间轴,使用最简单的HTML+CSS+JQUERY完成100个版本更新记录的华丽转身!>受到很多网友的喜爱,今天特别推出姊妹篇<纯手工打造漂亮的瀑 ...

  6. 纯手工打造漂亮的垂直时间轴,使用最简单的HTML+CSS+JQUERY完成100个版本更新记录的华丽转身!

    前言 FineUI控件库发展至今已经有 5 个年头,目前论坛注册的QQ会员 5000 多人,捐赠用户 500 多人(捐赠用户转化率达到10%以上,在国内开源领域相信这是一个梦幻数字!也足以证明Fine ...

  7. ndk学习20: jni之OnLoad动态注册函数

    一.原理 当在系统中调用System.loadLibrary函数时,该函数会找到对应的动态库, 然后首先试图找到"JNI_OnLoad"函数,如果该函数存在,则调用它 JNI_On ...

  8. ndk学习7: 使用静态库

    目录: 手工编译静态库 ndk-build编译静态库   手工编译静态库 老规矩还是先手工操作,知其然并知其所以然   需要用到的核心命令: gcc –g –c mod1.c mod2.c mod3. ...

  9. NDK学习4: Eclipse HelloWorld

    NDK学习4: Eclipse HelloWorld 1.配置Eclipse NDK环境  Window->preferences->android->ndk   2.新建Andro ...

随机推荐

  1. linq 多表分组查询统计

    var q1 = from orderitem in q2 join pd in _iProductDetailContract.Entities on orderitem.ProductDetail ...

  2. Java Servlet系列之Servlet生命周期

    Servlet生命周期定义了一个Servlet如何被加载.初始化,以及它怎样接收请求.响应请求,提供服务.在讨论Servlet生命周期之前,先让我们来看一下这几个方法: 1. init()方法 在Se ...

  3. VS中修改站点运行方式(集成 Or 经典)

    以前写过一篇博客使用HttpHander截取用户请求. 写进Web.Config时..运行会报 在集成环境下不能使用站点配置 就想改成经典..但是不会改..还修改过Framework配置什么的.. 那 ...

  4. Java多线程编程核心技术---对象及变量的并发访问(一)

    synchronized同步方法 "非线程安全"其实会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是"脏读",也就是渠道的数据其实是被更改 ...

  5. 修改ubuntu DNS的步骤/wget url报错: unable to resolve host address的解决方法

    wget url 报错:unable to resolve host address ‘url’,显然是无法解析主机地址,这就能看出是DNS解析的问题.解决办法就是配置可用的dns 一般是修改成为谷歌 ...

  6. JQuery-EasyUI与EXTjs有什么区别?

    一.ExtJS1.ExtJS可以用来开发RIA也即富客户端的AJAX应用,是一个用javascript写的,主要用于创建前端用户界面,是一个与后台技术无关的前端ajax框架.因此,可以把ExtJS用在 ...

  7. php正则表达式匹配用户名规则:由字母开头的6-16位字母和数字组成的字符串

    $pattern = '/^[a-zA-Z]{1}[a-zA-Z0-9]{5,15}$/i';

  8. [译]ES6箭头函数和它的作用域

    原文来自我的前端博客: http://www.hacke2.cn/arrow-functions-and-their-scope/ 在ES6很多很棒的新特性中, 箭头函数 (或者大箭头函数)就是其中值 ...

  9. 2015年11月30日 spring初级知识讲解(一)装配Bean

    序,Spring的依赖注入是学习spring的基础.IOC为控制反转,意思是需要的时候就由spring生成一个,而不是先生成再使用. 写在前面 Spring提供面向接口编程,面向接口编程与依赖注入协作 ...

  10. 老项目的#iPhone6与iPhone6Plus适配#LaunchImage适配

    本文永久地址为 http://www.cnblogs.com/ChenYilong/p/4020384.html,转载请注明出处.  Evernote印象笔记链接:https://www.everno ...