从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走过的全过程
- 浏览: 1030741 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (675)
- ios (214)
- android-course (5)
- unity3d (7)
- cocos2d (36)
- html5 (3)
- game (5)
- android (42)
- java (57)
- php (12)
- 创业 (10)
- SEO (3)
- 架构 (2)
- 数据库 (3)
- 产品设计 (9)
- 操作系统 (10)
- Web前端 (11)
- 其他 (50)
- GAE (1)
- mac os (8)
- Open Source (2)
- 序列号 (10)
- C (2)
- database (2)
- 算法 (6)
- 设计模式 (1)
- photoshop (1)
- 3dmax (1)
- maya (1)
- opengl (3)
- 游戏设计 (1)
- 趋势 (1)
- cocos2d-x (4)
- shell (3)
- c++ (30)
- lua (5)
- flash (1)
- spring (3)
- mysql (4)
- Git (6)
- xmpp (1)
- cocos2dx (14)
- mac (2)
- 编程规范 (2)
- windows (1)
- linux (5)
- coocs2dx (1)
- ubuntu (2)
- aws (1)
- OPENGLES (1)
- 原画 (1)
最新评论
-
jlees:
Best mobile app testing tool pc ...
iOS + XCode 4 + GHUnit = Mobile TDD+Continuous testing -
ipanda:
楼主,能否给一个Micro CloudFoundry的虚机或者 ...
Cloud Foundry使用及开发向导 -
love_zongming:
谢谢分享。。
visio2007序列号 -
雨花台舞水:
你这才是枪文把
套在 360 黑匣子外面的黑盒子:你被技术型枪稿吓到了么? -
hugh.wang:
改天试试
Mac版魔兽争霸3 1.24e下载
发表评论
-
cocos2dx3.x lua binding
2014-10-14 16:47 988ios的lua binding 详见参考:http:// ... -
android 打开 cclog 输出
2014-08-12 14:49 1365找到原因了,不能打印的原因在于我使用了CCLOG的宏而在And ... -
使用Cocos2d-x 3.0rc,一条命令打包Android
2014-06-13 17:56 14661、目录改动 每个版本都会有目录变动,这次的版本也不例外。 ... -
cocos2dx 提高 build_native.sh 编译速度
2014-05-14 15:57 1576进入生成的obj文件夹看看 proj.android\obj\ ... -
cocos2dx学习笔记
2013-11-26 10:02 7501.Constructors are protected ... -
[cocos2d-x]File文件的IO读写处理
2013-11-15 16:16 1540为了保存自定义数据文 ... -
iPhone: libpng error: CgBI: unknown critical chunk
2013-10-30 17:29 1507If you get this error when tryi ... -
cocos2d-x发生undefined reference to `XX'错误
2013-10-22 17:36 1201eclipse cocos2dx项目,出现错误 E:/Ac ... -
cocos2dx3.0 build_native.sh 需要这些环境变量
2013-10-22 15:25 1568#android SDK 位置 export ANDROI ... -
android的native开发的重要性
2013-10-22 14:59 14121=====概要(android的native开发的重要性,那 ... -
mac 不识别 android samsung手机
2013-10-21 16:30 1889使用Mac开发Android时,有可能无法识别手机,可以通过 ... -
cocos2d-x 3.0版本,eclipse编译时,识别不了std::thread
2013-10-21 15:08 1720在mac环境下,使用create-multi-platfor ... -
使用tolua++编译pk创建自定义类
2013-10-17 10:47 923在Lua第三篇中介绍了,如何在cocos2dx中使用Lua创 ...
相关推荐
总的来说,通过NDK编译Curl库,Android开发者可以充分利用Curl的强大功能,实现高效的网络通信,同时避免了Java层解析复杂网络协议的性能损失。不过,需要注意的是,原生代码的调试和维护通常比Java代码更复杂,因此...
**ndk-build.cmd**是NDK的构建脚本,它是基于Windows系统的批处理文件,用于编译和链接C/C++源代码。当你在Android项目中添加C/C++代码时,这个脚本会调用Makefile或其他构建系统(如CMake)来编译原生模块。它负责...
$ 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手机视频功能 #### 一、前言 随着移动设备处理能力的不断增强,越来越多的应用程序开始利用原生的C/C++代码来提高性能,尤其是在多媒体处理领域。FFmpeg是一款强大的跨平台...
- **生成动态库**:使用`ndk-build`或`cmake`构建工具,将静态库转化为动态库`.so`,针对不同的Android架构分别编译。 - **打包so库**:将编译得到的各个架构的.so文件整理到一个目录结构,符合Android的ABI分发...
3. **构建过程**: 开发者首先创建Android.mk文件,然后在命令行中运行`ndk-build`,它会解析Android.mk并编译源代码。编译后的库会被放置在指定的目录下,通常是`$(LOCAL_PATH)/obj`和`$(LOCAL_PATH)/libs`。 4. **...
1. **配置NDK环境**:确保Android Studio安装了NDK,并在项目的build.gradle文件中配置好NDK路径。 2. **添加库依赖**:将编译好的静态库或动态库添加到项目的jniLibs目录下,Android Studio会自动识别并链接这些库...
本项目重点是利用SonarQube对使用NDK编译的C/C++部分进行静态分析和质量检查。 在Android应用开发中,NDK主要用在以下几个场景: 1. 需要高性能计算或图形处理的部分,如游戏引擎。 2. 使用已有的C/C++库,避免重新...
然后,使用NDK的`ndk-build`或CMake工具进行编译,生成.a或.so库文件。 5. **JNI接口**:为了在Java层调用log4cpp,需要创建JNI接口。定义C++函数,如`void initLogger()`,并在Java中声明对应的native方法。通过...
3.1 集成与配置:开发者需要将NDK R13B添加到项目构建系统中,如Android Studio的Gradle插件,通过配置build.gradle文件来指定NDK路径和编译选项。 3.2 JNI接口:NDK开发通常涉及到Java Native Interface (JNI),它...
6. **执行编译**:运行`ndk-build`命令,编译器会生成`libmupdf.so`和其他相关的目标文件。这个过程可能会涉及到预处理、编译、汇编和链接等步骤。 7. **库文件结构**:在编译完成后,生成的`libmupdf.so`通常会被...
4. **交叉编译**:使用NDK的`ndk-build`命令进行交叉编译。这个过程会生成针对不同Android架构的`.so`库文件。 5. **Windows XP与Ubuntu 10.10**:本资源包含了在两种操作系统下编译的结果。在Windows XP环境下,...
《Android NDK R13B for Windows:深入解析与应用》 Android NDK(Native Development Kit)是Android开发中的一个重要工具集,它允许开发者使用C和C++编写原生代码,以实现高性能、低级别的系统操作。在Android...
- 执行 `<ndk_root>/ndk-build` 来编译 C 代码。 #### 四、实现 Native 函数 1. **修改 Android.mk 文件** - 修改 `jni/Android.mk` 文件,根据需要编译的文件进行调整。 ```makefile LOCAL_PATH := $(call my...
4. **编译构建**:使用Android Studio的Gradle构建系统,或者直接调用NDK的构建工具如`ndk-build`或CMake,生成.so库文件。 5. **调试与测试**:Android Studio提供了对原生代码的调试支持,可以设置断点,查看变量...
ndkBuild { path 'src/main/jni/Android.mk' // 指向你的Android.mk文件 } } } externalNativeBuild { ndkBuild { arguments 'NDK_VERSION=版本号' // 可以在这里指定NDK版本 } } } ``` 如果上述配置正确...
本特刊将深入解析NDK的关键概念、工作原理及其在实际开发中的应用。 一、NDK概述 1.1 定义与作用 NDK作为Android开发的一部分,它提供了一种方式来编译C和C++代码,并将其打包到APK中,供Android应用程序调用。NDK...
4. 使用 NDK 的 `ndk-build` 命令进行构建。 #### 六、总结 Android NDK R5 的配置与使用对于希望在 Android 应用中集成高性能 C/C++ 代码的开发者来说至关重要。通过合理利用 NDK 的特性,开发者不仅可以提升应用...
5. **C/C++代码编译和链接**:讲解如何使用NDK的`ndk-build`或CMake构建系统将C/C++源码编译为可执行库。 6. **JNI调试技巧**:分享如何在Android Studio或第三方工具中调试本地代码。 7. **内存管理**:探讨Java...
5. **构建与链接**:使用NDK的`ndk-build`脚本编译原生代码,并链接生成动态或静态库。 6. **集成到Android项目**:将生成的库文件(.so)放入项目的相应ABI目录下,与Java代码一起打包。 四、注意事项与最佳实践 ...