手工编译一个ndk程序

来源:互联网 发布:rip的udp端口号是 编辑:程序博客网 时间:2024/05/16 06:18

  • 一NDK环境配置
    • NDK目录结构
    • 添加环境变量
    • 编译
    • 链接
    • 运行
    • 源文件和编译脚本
      • helloc
      • makefile
    • Applicationmk和Androidmk
      • 1 STL支持
      • 2 异常支持
      • 3 C RTTI支持
      • Applicationmk NDK所有模块都支持
      • Androidmk 设置当前模块
    • 编译器介绍

一、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.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 := armeabiAPP_PLATFORM := android-14 APP_STL := stlport_staticAPP_CPPFLAGS += -fexceptions

Android.mk 设置当前模块

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE    := HelloLOCAL_SRC_FILES := Hello.cppinclude $(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++.exearm-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.exearm-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.exearm-linux-androideabi-ld.exe            链接器arm-linux-androideabi-ld.gold.exearm-linux-androideabi-ld.mcld.exearm-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         去除目标文件的符号信息
原创粉丝点击