手工编译一个ndk程序

一、NDK环境配置

1.NDK目录结构

目录名描述
build存放和编译相关的脚本文件,最外面的ndk-build就是调用该目录下的makefile文件,其中makefile文件都存放在build/core目录
docs帮助文档
platforms存放不同android版本,不同平台架构的头文件和库文件
prebuilt存放和编译相关工具比如make.exe
samplesndk代码例子,用根目录下的ndk-build即可编译
source源码目录,有一些头文件和库文件,比如gnu-libstdc,stlport
test一些测试样例,有很多例子可以从里面学习
toolchains不同平台的编译器链接器目录以及一些和编译连接相关的工具,gcc,ld等工具都在这个目录

2.添加环境变量

  • 新建环境变量

    ANDROID_NDK = G:\android-ndk-r12b
    
  • 在Pathpath环境变量中添加

    %ANDROID_NDK%   NDK根目录
    %ANDROID_NDK%\prebuilt\windows-x86_64\bin; make.exe目录
    
  • 测试环境变量


    以上则表示环境变量成功。

3.编译

G:\android-ndk-r12b\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin\arm-linux-androideabi-gcc-4.9.exe -IG:\android-ndk-r12b\platforms\android-14\arch-arm\usr\include -c hello.c

4.链接

G:\android-ndk-r12b\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin\arm-linux-androideabi-gcc-4.9.exe -LG:/android-ndk-r12b\platforms\android-14\arch-arm\usr\lib -Bdynamic -lgcc -nostdlib -lc Hello.o -o Hello G:/android-ndk-r12b\platforms\android-14\arch-arm\usr\lib\crtbegin_dynamic.o G:/android-ndk-r12b\platforms\android-14\arch-arm\usr\lib\crtend_android.o

5.运行

adb  push Hello /data/local     将文件拷到/data/local目录
adb shell chmod 777 /data/local/Hello   修改文件属性
adb shell /data/local/Hello     //运行程序

6. 源文件和编译脚本

hello.c

#include <stdio.h>

int main()
{
    printf("Hello NDK");
    return 0;
}

makefile

#文件名称
MODALE_NAME=Hello

#ndk根目录
NDK_ROOT=D:/android-ndk-r12b

#编译器根目录
TOOLCHAINS_ROOT=$(NDK_ROOT)/toolchains/arm-linux-androideabi-4.9/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-14/arch-arm

#sdk头文件搜索路径
PLATFROM_INCLUDE=$(PLATFROM_ROOT)/usr/include

#sdk库文件搜索路径
PLATFROM_LIB=$(PLATFROM_ROOT)/usr/lib



#删除
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 755 /data/local/tmp/$(MODALE_NAME)
    adb shell /data/local/tmp/$(MODALE_NAME) 
#运行程序
run:
    adb shell /data/local/tmp/$(MODALE_NAME) 

7. Application.mkAndroid.mk

7.1 STL支持

使用STLport
    APP_STL := stlport_shared  使用动态库
    APP_STL := stlport_static  使用静态库

使用GNU STL
    APP_STL := gnustl_shared  使用动态库
    APP_STL := gnustl _static  使用静态库

7.2 异常支持

在Android.mk 设置
    LOCAL_CPP_FEATURES += exceptions 设置当前模块
    LOCAL_CPPFLAGS += -fexceptions
    LOCAL_CPP_FEATURES优先级更高 

在Application.mk设置
    APP_CPPFLAGS += -fexceptions     NDK所有模块都支持

7.3 C++ RTTI支持

在Android.mk 设置
    LOCAL_CPP_FEATURES += rtti
    LOCAL_CPPFLAGS += -frtti 

在Application.mk设置
    APP_CPPFLAGS += -frtti

Application.mk NDK所有模块都支持

APP_ABI := armeabi
APP_PLATFORM := android-14 
APP_STL := stlport_static
APP_CPPFLAGS += -fexceptions

Android.mk 设置当前模块

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := Hello
LOCAL_SRC_FILES := Hello.cpp

include $(BUILD_EXECUTABLE)

8. 编译器介绍

arm-linux-androideabi-addr2line.exe     将程序地址转换为文件名和行号
arm-linux-androideabi-ar.exe 
arm-linux-androideabi-as.exe            gas汇编编译器
arm-linux-androideabi-c++.exe  
arm-linux-androideabi-g++.exe
arm-linux-androideabi-c++filt.exe       连接器使用它,防止重载函数冲突
arm-linux-androideabi-cpp.exe           c++编译器
arm-linux-androideabi-elfedit.exe       elf文件编辑器
arm-linux-androideabi-g++.exe           c++编译器
arm-linux-androideabi-gcc-4.6.exe  
arm-linux-androideabi-gcc.exe
arm-linux-androideabi-gcc.exe           c编译器
arm-linux-androideabi-gcov.exe          记录代码的执行路径
arm-linux-androideabi-gdb.exe           调试工具
arm-linux-androideabi-gprof.exe         程序性能测试工具
arm-linux-androideabi-ld.bfd.exe
arm-linux-androideabi-ld.exe            链接器
arm-linux-androideabi-ld.gold.exe
arm-linux-androideabi-ld.mcld.exe
arm-linux-androideabi-nm.exe            列出目标文件中的符号
arm-linux-androideabi-objcopy.exe       拷贝目标文件的内容到另一个文件
arm-linux-androideabi-objdump.exe       列出目标文件的信息
arm-linux-androideabi-ranlib.exe        产生归档文件索引
arm-linux-androideabi-readelf.exe       显示elf文件信息
arm-linux-androideabi-size.exe          显示文件段信息
arm-linux-androideabi-strings.exe       显示目标文件可打印的字符串
arm-linux-androideabi-strip.exe         去除目标文件的符号信息
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值