(转)NDK Android程序编译原理之浅析
感谢原文作者的总结,地址如下:
http://blog.csdn.net/nodeathphoenix/article/details/7684230
Android build/core下的编译脚本里会用到变量NDK_ROOT和NDK_PROJECT_PATH。但是这两个变量你都不是必须显式地设置对应环境变量。因为如果没有定义NDK_ROOT,脚本里拿字符串"build/core"去匹配当前脚本的全路径,截取该字符串前面的部分即是NDK_ROOT了。如果定义了NDK_PROJECT_PATH,则脚本会在该路径下去找jni目录下的 application.mk 和 android.mk;如果没有定义NDK_PROJECT_PATH,则脚本会查找"jni/Android.mk"来匹配得到NDK_PROJECT_PATH,然后在NDK_PROJECT_PATH目录下找到application.mk 和 android.mk。如果application.mk中的APP_BUILD_SCRIPT没有指定Android.mk的路径,则在application.mk当前所在的目录下找Android.mk;否则的话,就直接根据APP_BUILD_SCRIPT来找Android.mk。
Android下面编译程序,除了Android.mk之外, Application.mk也是必须要的。 通过查看buid/core/build-local.mk可知道,如果你没有写Application.mk,它会默认地使用build/core/default-application.mk,然后根据其中的APP_BUILD_SCRIPT调用Android.mk去编译.所以,如果刚好你不需要在Application.mk中去指定cpu的架构等信息,没有写Application.mk你也能正确编译。
Application.mk 中的APP_BUILD_SCRIPT是个可选的变量,可以根据需要来决定是否设置具体的值。正因为这个特性,我们可以根据Application.mk的位置分为$Project/jni/ 和 $NDK_ROOT/jni/中两种情况。
如果没有指定环境变量NDK_PROJECT_PATH,编译器会在当前执行编译命令的目录下通过匹配jni/Android.mk的方式来得到NDK_PROJECT_PATH。所以执行的时候只能在$Project当前应用程序的目录下执行$NDK_ROOT/ndk-build来编译。
Application.mk可以和Android.mk一起放在你的$Project/jni/目录下,如果Application.mk中没有指定APP_BUILD_SCRIPT变量的值,编译器会自动在make的当前目录下的jni目录下去找Android.mk. 如果Application.mk中指定了APP_BUILD_SCRIPT变量的值,则编译器会按照此变量的值去读Android.mk.所以。一般对于Application.mk和Android.mk都在$Project/jni/目录下的情况,我们没有必要在Application.mk中指定APP_BUILD_SCRIPT,直接让编译器读取$Project/jni/目录下的Android.mk就可以了。
对于Application.mk在$NDK_ROOT/jni/下的情况,则必须要指定APP_BUILD_SCRIPT,APP_PROJECT_PATH也是可选的,同时必须要指定环境变量NDK_PROJECT_PATH---编译器根据此环境变量找到$NDK_ROOT/jni/Application.mk。
注意APP_PROJECT_PATH对于"$PROJECT/jni/Application.mk"文件是可选的,但对于"$NDK/apps/<myapp>/Application.mk"是强制需要的。