[Android NDK開發學習(一):環境的配置](http://blog.csdn.net/qq_17766199/article/details/48174875)
[Android NDK開發學習(二):學習官方Demo : HelloJni](http://blog.csdn.net/qq_17766199/article/details/48179073)
[Android NDK開發學習(三):創建第一個項目](http://blog.csdn.net/qq_17766199/article/details/48241815)
**Android NDK開發學習(四):NDK配置介紹**
NDK程序可以使用兩個配置文件:Android.mk和Application.mk,其中Android.mk文件主要描述了如何編譯C/C++代碼,而Application文件用于描述當前應用程序需要哪些模塊。(因為本人解除NDK時間也不長,所以相關的關鍵字遇到的也不多。這里介紹一些自己遇到的。以后有新的會持續更新。)
這里我采取的方法時導入官方Demo:HelloNeon和NativeActivity這個項目。查看Android.mk和Application.mk文件。對遇到的關鍵詞進行查找資料。這里匯總一下。
1、首先是HelloNeon項目的Android.mk(導入方法見前面的教程方法)

由上到下:
(1).第一行LOCAL_PATH:該變量用于指定當前Android.mk文件所在的路徑。必須在Android.mk文件第一行定義。
(2).第三行CLEAR_VARS: 指定一個用于**清空幾乎**所有以LOCAL_開頭的變量(除了LOCAL_PATH變量)。在Android.mk文件的第二行**必須**執行這個腳本,這是必要的,因為所有的編譯控制文件都在同一個GNU MAKE執行環境中,所有的變量都是全局的。如:include $(CLEAR_VARS)。
(3).第五行LOCAL_MODULE:該變量指定模塊名字。此名稱**必須是所有模塊名中唯一存在的,并且不包括空白分隔符**。模塊名決定生成的庫文件名,如:模塊名位Hello,生成的動態庫文件名就為libHello.so。我們在引用模塊的時候,只能使用定義的模塊名,不應使用庫文件名。
(4).第七行與第十四行LOCAL_SRC_FILES:該變量制定了參與模塊編譯的C/C++源文件名。文件名都相對于LOCAL_PATH,如果指定多個文件,中間用空格分隔。
(5).第九行和第十一行TARGET_ARCH_ABI:用于分析Android.mk的目標CPU+ABI的名稱(ABI,即應用程序二進制接口)。**所有基于ARM的ABI都必須將TARGET_ARCH變量的值設為arm,但可以設置不同的TARGET_ARCH_ABI變量值**。
(6).第十行和第十二行LOCAL_CFLAGS += -DXXX ? 相當于在所有源文件中增加一個宏定義#define XXX。
例如:代碼第十行為LOCAL_CFLAGS := -DHAVE_NEON=1 ?所以在helloneon.c文件中有如圖一段代碼:

(7).第十七行LOCAL_STATIC_LIBRARIES表示該模塊需要使用哪些靜態庫,以便在編譯時進行鏈接。
(8).第十九行LOCAL_LDLIBS鏈接的庫不產生依賴關系,一般用于不需要重新編譯的庫,如庫不存在,則會報錯找不到。且貌似只能鏈接那些存在于系統目錄下本模塊需要連接的庫。如果某一個庫既有動態庫又有靜態庫,那么在默認情況下是鏈接的動態庫而非靜態庫。這里是鏈接log庫,用于在文件中打印信息。
(9).第二十一行BUILD_SHARED_LIBRARY指定一個建立共享庫的GNU Make腳本文件。該腳本文件會根據以“LOCAL_”開頭的變量決定如何生成共享庫,其中LOCAL_MODULE和LOCAL_SRC_FILES是必須設置的兩個變量。該變量的用法:include $(BUILD_SHARED_LIBRARY),生成的共享庫文件名是$(LOCAL_MODULE).so。
(10).要想導入一個模塊,放置如下所示的一行指令,最好放在你的Android.mk文件結束處:$(call import-module,<tag>)。這里導入
cpufeatures用于第十七行的編譯。
(11).對于第九行至第十五行的簡單理解:如果是armeabi-v7a和x86平臺則編譯helloneon-intrinsics.c.neon文件。編譯結果如下圖:

2、NativeActivity項目的Application.mk

(1).APP_ABI在默認情況下,NDK會使用'armeabi' ABI 來生成二進制機器碼,這是基于ARMv5TE的浮點運算CPU,這可以通過使用此變量來選項不同的ABI.
(2).APP_PLATFORM 制定編譯Android平臺名稱。
3、HelloNeon項目編譯后:

4、補充
(1).BUILD_STATIC_LIBRARY:指定一個簡歷靜態庫的GNU Make腳本。靜態庫不能被復制到Android應用程序包(apk)中,但可以用于建立共享庫。使用該變量的方法:include $(BUILD_STATIC_LIBRARY),生成的靜態庫文件名是$(LOCAL_MODULE).a。
(2).TARGET_ARCH:編譯Android的目標CPU架構的名稱。如:arm。
(3).TARGET_PLATFORM:指定分析Android.mk文件的Android平臺名稱。
(4).TARGET_ABI:用于連接目標平臺和ABI,也就是$(TARGET_PLATFORM)-$(TARGET_ARCH_ABI),主要用來測試真是設別中特定的目標系統映像。
最后附上參考鏈接:[點擊打開鏈接](http://blog.csdn.net/kwuwei/article/details/19428993)? ?[點擊打開鏈接](http://blog.csdn.net/kwuwei/article/details/21718097)