Android程序编译原理之浅析

 

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.

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/中两种情况。

Application.mk可以和Android.mk一起放在你的$Project/jni/目录下,编译器会自动在jni目录下去找Application.mk和Android.mk. 如果Application.mk中指定了APP_BUILD_SCRIPT变量的值,则编译器会按照此变量的值去读Android.mk.所以,一般情况下,我们没有必要在Application.mk中指定APP_BUILD_SCRIPT和APP_PROJECT_PATH,直接让编译器读取$Project/jni/目录下的Android.mk就可以了。因为没有指定环境变量NDK_PROJECT_PATH,所以编译器只能通过匹配jni/Android.mk的方式来得到。所以执行的时候只能在$Project当前应用程序的目录下执行./ndk-build来编译。

对于Application.mk在$NDK_ROOT/jni/下的情况,则必须要指定APP_BUILD_SCRIPT,APP_PROJECT_PATH也是可选的。但是必须要指定环境变量NDK_PROJECT_PATH---为了让编译器找到Application.mk(因为没有jni/Android.mk,所以编译器无法通过匹配的方式来得到NDK_PROJECT_PATH)。

注意APP_PROJECT_PATH对于"$PROJECT/jni/Application.mk"文件是可选的,但对于"$NDK/apps/<myapp>/Application.mk"是强制需要的。

 

http://blog.csdn.net/nodeathphoenix/article/details/7684230

你可能感兴趣的:(android,jni,脚本,Build,Path,编译器)