標籤:
原文連結 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"是強制需要的。
Android程式編譯原理之淺析(NDK編譯)