`

NDK build编译的解析

 
阅读更多

从ndk-build命令开始解析:

1,ndk-build.sh:编译总脚本
    a,获取make工具,找到makefile文件;
    b,执行make -f  makefile(or othername:build-local.mk);
2,build-local.mk:启动的makefile
    a,检查NDK_ROOT的合法性;
    b,初始化环境init.mk;
    c,NDK_PROJECT_PATH:设法找到NDK工程所在的目录;找到NDK_APPLICATION_MK即Application.mk文件,以及输出目录:NDK_APP_OUT := $(NDK_PROJECT_PATH)/obj
    d,Fake an application named 'local',虚拟app,并添加之include $(BUILD_SYSTEM)/add-application.mk;
      Application.mk文件就是在这一步解析的,通过解析获取变量:APP_DEBUG,APP_MODULES,APP_PROJECT_PATH,APP_PLATFORM,APP_ABI,APP_BUILD_SCRIPT,APP_OPTIM
      APP_CFLAGS,APP_STL,NDK_ALL_APPS,此处解析的是:/home/tony/workstation/android-ndk-r6b/build/core/default-application.mk这个文件;
    e,开始编译 :include $(BUILD_SYSTEM)/build-all.mk
3,init.mk:编译环境初始化
    a,检查makefile版本(3.8.1以上);
    b,再次检查NDK_ROOT的合法性;
    c,检查NDKLOG;
    d,设置主机的系统:HOST_OS和主机架构:HOST_ARCH,进而的到一个主机标签:HOST_TAG;如:HOST_OS = linux-HOST_ARCH =x86 --> HOST_TAG = linux-x86;
    e,检查使用的awk工具和AWK脚本路径;
    f,设置所有的编译脚本路径:BUILD_SYSTEM := $(NDK_ROOT)/build/core,以及公共定义$(BUILD_SYSTEM)/definitions.mk
    g,添加交叉编译工具:$(BUILD_SYSTEM)/add-toolchain.mk,在目录$(wildcard $(NDK_ROOT)/toolchains/*/config.mk)下,有所有交叉编译工具的定义,每个工具通过
      config.mk和setup.mk两个文件来定义;可以得到:
      NDK_ALL_TOOLCHAINS:    arm-linux-androideabi-4.4.3  x86-4.4.3
       NDK_ALL_ABIS:    armeabi armeabi-v7a  x86
    h,在NDK_PLATFORMS_ROOT下得到所有支持的platform($(NDK_PLATFORMS_ROOT)),
      如:android-3 android-4 android-5 android-8 android-9,对于每种平台执行:include $(BUILD_SYSTEM)/add-platform.mk
      添加之,并指定:SYSROOT所在,如$(NDK_PLATFORMS_ROOT)/$(_platform)/arch-$(_abi)) = /home/tony/workstation/android-ndk-r6b/platforms/android-9/arch-arm
      然后找到各个level值以及最大值
4,build-all.mk,编译开始:
    a,初始化各个脚本变量,这些都是Android文件中常用的:
        CLEAR_VARS                := $(BUILD_SYSTEM)/clear-vars.mk
        BUILD_HOST_EXECUTABLE     := $(BUILD_SYSTEM)/build-host-executable.mk
        BUILD_HOST_STATIC_LIBRARY := $(BUILD_SYSTEM)/build-host-static-library.mk
        BUILD_STATIC_LIBRARY      := $(BUILD_SYSTEM)/build-static-library.mk
        BUILD_SHARED_LIBRARY      := $(BUILD_SYSTEM)/build-shared-library.mk
        BUILD_EXECUTABLE          := $(BUILD_SYSTEM)/build-executable.mk
        PREBUILT_SHARED_LIBRARY   := $(BUILD_SYSTEM)/prebuilt-shared-library.mk
        PREBUILT_STATIC_LIBRARY   := $(BUILD_SYSTEM)/prebuilt-static-library.mk
        编译过程中会用的一些变量,伪目标,先把他们初始化了
        ANDROID_MK_INCLUDED := \
        $(CLEAR_VARS) \
        $(BUILD_HOST_EXECUTABLE) \
        $(BUILD_HOST_STATIC_LIBRARY) \
        $(BUILD_STATIC_LIBRARY) \
        $(BUILD_SHARED_LIBRARY) \
        $(BUILD_EXECUTABLE) \
        $(PREBUILT_SHARED_LIBRARY) \

        # this is the list of directories containing dependency information
        # generated during the build. It will be updated by build scripts
        # when module definitions are parsed.
        #
        ALL_DEPENDENCY_DIRS :=

        # this is the list of all generated files that we would need to clean
        ALL_HOST_EXECUTABLES      :=
        ALL_HOST_STATIC_LIBRARIES :=
        ALL_STATIC_LIBRARIES      :=
        ALL_SHARED_LIBRARIES      :=
        ALL_EXECUTABLES           :=

        WANTED_INSTALLED_MODULES  :=
        等等。。。
    b,编译开始:
        $(foreach _app,$(NDK_APPS),\
          $(eval include $(BUILD_SYSTEM)/setup-app.mk)\
        )
        对每一个app循环,如Fake出来的app:local
5,setup-app.mk:
    a,对与每个app,确定TARGET_PLATFORM和TARGET_ARCH_ABI,检查他们的合法性;
    b,对于每个TARGET_ARCH_ABI,进行include $(BUILD_SYSTEM)/setup-abi.mk操作;
6,setup-abi.mk:
    a,确定:TARGET_ARCH
    b,确定:TARGET_OUT,TARGET_OBJS,TARGET_GDB_SETUP;
    c,保存:TARGET_PLATFORM -->TARGET_PLATFORM_SAVED
    d,include $(BUILD_SYSTEM)/setup-toolchain.mk,建立交叉编译;
//------------------------------------------------------以上涉及的关键控制(如app,abi)都在application.mk里面定义--------------------------------
7,setup-toolchain.mk:
    a,获取TARGET_TOOLCHAIN,编译工具
    b,获取TARGET_ABI,目标的指令集
    c,SYSROOT,用于指定编译时所依赖的库和头文件。
    d,统计$(__ndk_modules)模块,并计算每个模块的依赖
    e,对于每个模块执行:build-binary.mk
8,build-binary.mk:
    a,统计出每个模块里面的变量定义:include $(BUILD_SYSTEM)/import-locals.mk
      计算出,LOCAL_CPP_EXTENSION,LOCAL_CFLAGS,LOCAL_OBJECTS,LOCAL_ARM_MODE,LOCAL_ARM_NEON,LOCAL_SRC_FILES,LOCAL_DEPENDENCY_DIRS
      LOCAL_STATIC_LIBRARIES,LOCAL_SHARED_LIBRARIES ,LOCAL_WHOLE_STATIC_LIBRARIES, LOCAL_LDLIBS,分问库和源文件两类
    b,根据是静态库,动态库或者可执行文件三种类型来进行5种情况的编译,
        I,$(cmd-build-shared-library):If this is a shared library module
        II,$(cmd-build-executable):If this is an executable module
        III,$(cmd-build-static-library):If this is a static library module
        IV,Prebuilt:If this is a prebuilt module
        V,cmd-strip:If this is an installable module
        其中,I,II,III,三种情况使用的编译命令参数可在 $(NDK_ROOT)/toolchains/arm-linux-androideabi-4.4.3/setup.mk中找到定义,
        系统中也有默认的(default-build-commands)

//------------------------------------------------------以上关键控制(如:LOCAL_XXX)都在Android.mk里面定义--------------------------------------

Note:
    如果你的工程没有Application.mk文件,则系统会用默认的,$(NDK_ROOT)/build/core/default-application.mk

    以上就是android-ndk编译文件make走过的全过程

分享到:
评论

相关推荐

    android使用NDK编译curl库源码

    总的来说,通过NDK编译Curl库,Android开发者可以充分利用Curl的强大功能,实现高效的网络通信,同时避免了Java层解析复杂网络协议的性能损失。不过,需要注意的是,原生代码的调试和维护通常比Java代码更复杂,因此...

    incredibuild_ndk-build.rar

    **ndk-build.cmd**是NDK的构建脚本,它是基于Windows系统的批处理文件,用于编译和链接C/C++源代码。当你在Android项目中添加C/C++代码时,这个脚本会调用Makefile或其他构建系统(如CMake)来编译原生模块。它负责...

    从Android NDK安装ARM交叉编译工具链

    $ sudo android-ndk-r9b/build/tools/make-standalone-toolchain.sh --platform=android-17 --system=linux-`uname -m` --toolchain=arm-linux-androideabi-4.7 --install-dir=/opt/android-ndk-toolchain/ ...

    用Android_NDK编译FFmpeg,RTSP手机视频

    ### 使用Android NDK编译FFmpeg与实现RTSP手机视频功能 #### 一、前言 随着移动设备处理能力的不断增强,越来越多的应用程序开始利用原生的C/C++代码来提高性能,尤其是在多媒体处理领域。FFmpeg是一款强大的跨平台...

    在Linux下编译FFmpeg+android ndk成功的脚本及so库

    - **生成动态库**:使用`ndk-build`或`cmake`构建工具,将静态库转化为动态库`.so`,针对不同的Android架构分别编译。 - **打包so库**:将编译得到的各个架构的.so文件整理到一个目录结构,符合Android的ABI分发...

    android_ndk.rar

    3. **构建过程**: 开发者首先创建Android.mk文件,然后在命令行中运行`ndk-build`,它会解析Android.mk并编译源代码。编译后的库会被放置在指定的目录下,通常是`$(LOCAL_PATH)/obj`和`$(LOCAL_PATH)/libs`。 4. **...

    使用Android NDK编译好的Android平台的oSIP库

    1. **配置NDK环境**:确保Android Studio安装了NDK,并在项目的build.gradle文件中配置好NDK路径。 2. **添加库依赖**:将编译好的静态库或动态库添加到项目的jniLibs目录下,Android Studio会自动识别并链接这些库...

    SonarQube扫描NDK编译的C/C++项目

    本项目重点是利用SonarQube对使用NDK编译的C/C++部分进行静态分析和质量检查。 在Android应用开发中,NDK主要用在以下几个场景: 1. 需要高性能计算或图形处理的部分,如游戏引擎。 2. 使用已有的C/C++库,避免重新...

    log4cpp Android NDK 开发

    然后,使用NDK的`ndk-build`或CMake工具进行编译,生成.a或.so库文件。 5. **JNI接口**:为了在Java层调用log4cpp,需要创建JNI接口。定义C++函数,如`void initLogger()`,并在Java中声明对应的native方法。通过...

    android-ndk-r13b

    3.1 集成与配置:开发者需要将NDK R13B添加到项目构建系统中,如Android Studio的Gradle插件,通过配置build.gradle文件来指定NDK路径和编译选项。 3.2 JNI接口:NDK开发通常涉及到Java Native Interface (JNI),它...

    MuPDF1.2编译生成的libmupdf.so文件

    6. **执行编译**:运行`ndk-build`命令,编译器会生成`libmupdf.so`和其他相关的目标文件。这个过程可能会涉及到预处理、编译、汇编和链接等步骤。 7. **库文件结构**:在编译完成后,生成的`libmupdf.so`通常会被...

    MuPDF1.0编译生成的libmupdf.so文件

    4. **交叉编译**:使用NDK的`ndk-build`命令进行交叉编译。这个过程会生成针对不同Android架构的`.so`库文件。 5. **Windows XP与Ubuntu 10.10**:本资源包含了在两种操作系统下编译的结果。在Windows XP环境下,...

    android-ndk-r13b-windows-x86-64

    《Android NDK R13B for Windows:深入解析与应用》 Android NDK(Native Development Kit)是Android开发中的一个重要工具集,它允许开发者使用C和C++编写原生代码,以实现高性能、低级别的系统操作。在Android...

    Android NDK 开发教程三

    - 执行 `<ndk_root>/ndk-build` 来编译 C 代码。 #### 四、实现 Native 函数 1. **修改 Android.mk 文件** - 修改 `jni/Android.mk` 文件,根据需要编译的文件进行调整。 ```makefile LOCAL_PATH := $(call my...

    android-ndk-r13b-windows-x86_64

    4. **编译构建**:使用Android Studio的Gradle构建系统,或者直接调用NDK的构建工具如`ndk-build`或CMake,生成.so库文件。 5. **调试与测试**:Android Studio提供了对原生代码的调试支持,可以设置断点,查看变量...

    Android NDK *** could not be resolved

    ndkBuild { path 'src/main/jni/Android.mk' // 指向你的Android.mk文件 } } } externalNativeBuild { ndkBuild { arguments 'NDK_VERSION=版本号' // 可以在这里指定NDK版本 } } } ``` 如果上述配置正确...

    Android NDK 相关资料 【eoe特刊】第七期:NDK.rar

    本特刊将深入解析NDK的关键概念、工作原理及其在实际开发中的应用。 一、NDK概述 1.1 定义与作用 NDK作为Android开发的一部分,它提供了一种方式来编译C和C++代码,并将其打包到APK中,供Android应用程序调用。NDK...

    android ndk r5 配置

    4. 使用 NDK 的 `ndk-build` 命令进行构建。 #### 六、总结 Android NDK R5 的配置与使用对于希望在 Android 应用中集成高性能 C/C++ 代码的开发者来说至关重要。通过合理利用 NDK 的特性,开发者不仅可以提升应用...

    jni、ndk绝命讲解

    5. **C/C++代码编译和链接**:讲解如何使用NDK的`ndk-build`或CMake构建系统将C/C++源码编译为可执行库。 6. **JNI调试技巧**:分享如何在Android Studio或第三方工具中调试本地代码。 7. **内存管理**:探讨Java...

    android-ndk-r6

    5. **构建与链接**:使用NDK的`ndk-build`脚本编译原生代码,并链接生成动态或静态库。 6. **集成到Android项目**:将生成的库文件(.so)放入项目的相应ABI目录下,与Java代码一起打包。 四、注意事项与最佳实践 ...

Global site tag (gtag.js) - Google Analytics