在讀Android.mk文件時,大家會遇到大量的系統的變量,如果不明白他們的含義,這將會嚴重的阻礙你的閱讀,最終糊裡糊塗的讀完,下面我介紹下我學習這些變量的筆記,和大家一起分享,有錯誤或解釋不到的地方期望大家給我留言,一起討論學習。
Android.mk的變量
一.自定義變量:
在Android.mk文件中自定義變量要遵守以下規則:
1.不能以LOCAL_開頭(例如:LOCAL_path);
2.不能以PRIVATE_、NDK_、APP_開頭
3.不能全用小寫字母(例如:my-dir)
4.建議使用MY_前綴的自定義變量
5.最重要是不能與NDK編譯系統保留的變量名一樣。
二.NDK編譯系統保留的變量及其介紹:
1.CLEAR_VARS
指出了編譯腳本中清除了“include$(CLEAR_VARS)”和“include$(BUILD_XXX)”之間的幾乎所有的LOCAL_XXX變量,即本模塊中不包含的所有的全局變量,在新模塊腳本開始時必須包含的變量。通常一個功能模塊以“include$(CLEAR_VARS)”開始。
2.BUILD_SHARED_LIBRARY
指出了一個編譯腳本收集一個模塊中所有的LOCAL_XXX變量的信息,並確定在你的資源文件下如何編譯一個動態庫。通常一個模塊以“include $(BUILD_XXX)”結束。
注意:在這個模塊中必須包含LOCAL_MODULE和LOCAL_SRC_FILES變量並賦值。模塊將會編譯LOCAL_SRC_FILES指定的資源文件生成一個名為“lib$(LOCAL_MODULE).so”文件
3.BUILD_STATIC_LIBRARY
同第2條類似它編譯出了一個靜態庫
指出了一個編譯腳本收集一個模塊中所有的LOCAL_XXX變量的信息,並確定在你的資源文件下如何編譯一個靜態庫。生成一個名為“include $(LOCAL_MODULE).a”文件
4.PREBUILT_SHARED_LIBRARY
指出了一個編譯腳本來編譯一個預動態庫,在編譯預動態庫中LOCAL_SRC_FILES必須是一個單一的路徑而不是一系列的資源文件。
5.PREBUILT_STATIC_LIBRARY
與第4條類似,它編譯成一個預靜態庫
指出了一個編譯腳本來編譯一個預靜態庫,在編譯預靜態庫中LOCAL_SRC_FILES必須是一個單一的路徑而不是一系列的資源文件。
注意:PREBUILT_STATIC/SHARED_LIBRARY與STATIC/SHARED_LIBRARY的區別在於:
1.預動/靜態庫中,LOCAL_SRC_FILES指定的是一個單一的路徑,在此目錄下可以放編好的動/靜態庫,在編譯系統時可直接進行編譯,也即是說,有此變量不需要源代碼,只要有編好的庫即可,這樣就可以使用所有的不開源的第三方庫。
2.可以直接放一個你自己編好的庫,這樣在編譯系統時省略了編譯此庫的時間,從而提過編譯速率。
6.TARGET_ARCH
目標CPU平台的名字,如同在Android開放源碼中指定的那樣。如果是’arm’,表示要生成ARM兼容的指令,與CPU架構的修訂版無關
7.TARGET_PLATFORM
Android.mk解析的時候,目標Android平台的名字,例如:“android-3對應Android 1.5系統,現在只支持'android-1.5'
8.TARGET_ARCH_ABI
CPU+ABI的名字,只支持’arm’,它的含義是:ARMv5TE、armeabi-v7a或更高級CPU,並且具有'softfloat'浮點支持。
其他的ABI將在以後的NDK版本中介紹,它們會有不同的名字。注意所有基於ARM的ABI都會把'TARGET_ARCH'定義成‘arm’,但是會有不同的‘TARGET_ARCH_ABI’
9.TARGET_ABI
目標平台和abi的組合,它事實上被定義成$(TARGET_PLATFORM)-$(TARGET_ARCH_ABI)在你想要在真實的設備中針對一個特別的目標系統進行測試時,會有用。
在默認的情況下,它會是'android-1.5-arm'
更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11