一、NDK环境配置
1.NDK目录结构
目录名 | 描述 |
---|---|
build | 存放和编译相关的脚本文件,最外面的ndk-build就是调用该目录下的makefile文件,其中makefile文件都存放在build/core目录 |
docs | 帮助文档 |
platforms | 存放不同android版本,不同平台架构的头文件和库文件 |
prebuilt | 存放和编译相关工具比如make.exe |
samples | ndk代码例子,用根目录下的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.mk
和Android.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 去除目标文件的符号信息