从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走过的全过程
- 浏览: 1004601 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (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 942ios的lua binding 详见参考:http:// ... -
android 打开 cclog 输出
2014-08-12 14:49 1316找到原因了,不能打印的原因在于我使用了CCLOG的宏而在And ... -
使用Cocos2d-x 3.0rc,一条命令打包Android
2014-06-13 17:56 14221、目录改动 每个版本都会有目录变动,这次的版本也不例外。 ... -
cocos2dx 提高 build_native.sh 编译速度
2014-05-14 15:57 1521进入生成的obj文件夹看看 proj.android\obj\ ... -
cocos2dx学习笔记
2013-11-26 10:02 6981.Constructors are protected ... -
[cocos2d-x]File文件的IO读写处理
2013-11-15 16:16 1496为了保存自定义数据文 ... -
iPhone: libpng error: CgBI: unknown critical chunk
2013-10-30 17:29 1446If you get this error when tryi ... -
cocos2d-x发生undefined reference to `XX'错误
2013-10-22 17:36 1131eclipse cocos2dx项目,出现错误 E:/Ac ... -
cocos2dx3.0 build_native.sh 需要这些环境变量
2013-10-22 15:25 1520#android SDK 位置 export ANDROI ... -
android的native开发的重要性
2013-10-22 14:59 13431=====概要(android的native开发的重要性,那 ... -
mac 不识别 android samsung手机
2013-10-21 16:30 1834使用Mac开发Android时,有可能无法识别手机,可以通过 ... -
cocos2d-x 3.0版本,eclipse编译时,识别不了std::thread
2013-10-21 15:08 1691在mac环境下,使用create-multi-platfor ... -
使用tolua++编译pk创建自定义类
2013-10-17 10:47 886在Lua第三篇中介绍了,如何在cocos2dx中使用Lua创 ...
相关推荐
arm平台下使用ndk工具交叉编译python,用于android系统;android-arm平台ndk交叉编译python
ndk-build Native方法编译工具
android studio ndk-build 编译C生成.so文件, 要把代码中加密的部分打包成so文件,
eclipse中ndk 自动编译配置
在Ubuntu的情况下,ndk-build编译C++成Android Studio可用的so文件。这里是一个将android-ndk-r21e生成交叉编译链之后,可以直接使用ndk-build这个指令就可以生成Android Studio可以使用的依赖库.so文件。CRC16是一...
curl库源码添加了curl_config.h和mk文件,可以直接跳转到目录使用ndk-build编译出so库.
live555 库 和 testRtspClient.cpp 编译生成静态库 和 可执行文件 testRtspClient 编译方法: 首先进入各个模块执行 Makefile,将静态库拷贝至上层目录 执行 ndk-build
ndk-r17b编译及使用ollvm-tti步骤(提供编译后文件) 源码地址: https://github.com/yazhiwang/ollvm-tll 一、编译ollvm-tti 1.git clone https://github.com/yazhiwang/ollvm-tll.git 2.mkdir build 3.cd ...
下载完的ndk-build.cmd和profile.xml覆盖到NDK目录(如E:\android\android-ndk-r10e)下,记得原有的ndk-build要备份一下。
Android NDK 交叉编译工具 Android NDK 交叉编译工具
cd /cygdrive/d/workspace/.../jni //跳转到项目jni目录 /cygdrive/d/android-ndk-r8/ndk-build //编译 /cygdrive/d/android-ndk-r8/ndk-build clean //清除
详细介绍android ndk编译环境搭建,可以自行编译android app所需的C++/C代码实现的高效率功能动态库文件,借JAVA层调用.
通过ndk编译opencv源码,能够根据自己的需求修改编译对应的opencv库。整个过程重要的也就是写makefile文件进行编译而已。
详细的描述了Android NDK下编译ffmpeg开源库的步骤。
Windows下使用git bash通过配置该ndk-build可以实现在git bash中执行ndk-build功能
ubuntu下android ndk编译环境搭建,android应用程序开发,环境编译
ubuntu下ndk编译ffmpeg0.8.1,详细介绍了如何将ffmpeg移植到linux下,生成的so动态链接库文件可以直接在android里使用。
用ndk r9编译的ffmpeg2.2.4库,可以在android中通过jni方法调用, 头文件请自己到官网下载源代码
使用Android NDK编译Android平台的eXosip库,有静态库和动态库。
ffmpeg4.16 ndk21 android 21 版本编译的库,包含 arm-v7a、arm-v8,包含include、动态链接库.so文件。