Android.mk

  android ndk開發有一個重要的文件 Android.mk,他雖然重要,但是對它進行深入介紹的文檔卻比較的少,這裏將對Android.mk中常用的宏和變量進行說明:

    由於這一部分的內容多,資料零散,本文檔會進行持續性的更新

    方便他人亦是方便自己,如果覺得還行就下右邊投票吧,這樣可以幫助其他人更快的找到解決問題的方法;有疑問的也可留言哦, 謝謝!

工具/原料

  • Win7 x64
  • jdk1.8.0_11
  • adt-bundle-windows-x86_64-20140702
  • android-ndk-r10

變量

  1. 1

    LOCAL_PATH := $(call my-dir)

    1、解釋 LOCAL_PATH

    英文:如下圖

    中文:Android.mk 開始必須定義變量 LOCAL_PATH,它用來指定源文件的位置

    2、解釋 my-dir

    英文:如下圖

    中文:編譯系統提供的'my-dir'宏函數,被用來獲取當前的目錄。

    Android.mk 常用宏和變量
  2. 2

    include $(CLEAR_VARS)

    1、解釋 CLEAR_VARS:

    英文:如下圖

    中文:編譯系統提供CLEAR_VARS變量,它指向了一個用來清除 LOCAL_ 開頭的變量(LOCAL_PATH除外)的makefile文件,需要它的原因是整個的編譯上下文中,所有的變量都是全局的,這樣就可以保證這些變量只在局部範圍內起作用;

    Android.mk 常用宏和變量
  3. 3

    LOCAL_MODULE := hello-jni

    1、解釋 LOCAL_MODULE:

    英文:如下圖

    中文:每一個android.mk文件中都必須定義一個模塊標示 LOCAL_MODULE , 這個名字必須是唯一的並且不包含任何的空格,編譯系統將自動的修改生成文件的前綴和後綴,如一個模塊爲'foo'共享庫將被改爲'libfoo.so';

        重要提示,如果你的模塊名爲'libfoo',編譯系統生成的文件爲 'libfoo.so', 而不會去再增加前綴,當你使用的時候,android平臺會自動識別;

    Android.mk 常用宏和變量
  4. 4

    LOCAL_SRC_FILES := hello-jni.c

    1、解釋 LOCAL_SRC_FILES

    英文:如下圖

    中文:LOCAL_SRC_FILES必須包含一系列的C/C++源文件,他們將會被建立和裝載到模塊中,注意你不應該把需要包含的頭文件列在這裏,因爲建立系統將自動計算依賴項,只有源文件才能夠被編譯器識別;

    2、解釋 LOCAL_CPP_EXTENSION

    英文:如下圖    

    中文:注意默認的c++文件擴展名是'.cpp', LOCAL_CPP_EXTENSION可以用來指定不同類型的擴展名,不要忘了前面的點(如:'.cxx' 將起作用, 但是 'cxx'不會起作用).

    如:LOCAL_CPP_EXTENSION := .cc .cpp

    Android.mk 常用宏和變量
  5. 5

    include $(BUILD_SHARED_LIBRARY)

    1、解釋 BUILD_SHARED_LIBRARY

    英文:如下圖

    中文:‘建立系統’提供個變量 BUILD_SHARED_LIBRARY, 將根據在‘include’之前定義的所有的信息和LOCAL_前綴的變量,決定將建立什麼,如何正確的生成共享庫;

    2、解釋  BUILD_STATIC_LIBRARY

    英文: 如下圖

    中文: 同上,只不過它生成的是靜態庫

    Android.mk 常用宏和變量
  6. 6

    LOCAL_C_INCLUDES :=   $(NDK_ROOT)/sources/third_party/freetype 

    1、解釋 NDK_ROOT

    中文:NDK_ROOT 代表的是ndk的根目錄,如我的是“D:\Android\android-ndk-r10”,這個例子是用來加載ndk根目錄下的freetype的頭文件路徑;

  7. 7

    LOCAL_LDFLAGS := \

        $(LOCAL_PATH)/libs/$(TARGET_ARCH_ABI)/libfreetype.a

    1、解釋 LOCAL_LDFLAGS

    中文:用來加載用戶自己的靜態庫(.a文件)

    2、解釋 TARGET_ARCH_ABI

    中文:當前的cpu/abi的類型,在鏈接不同類型的CPU_ABI時非常有用,如下圖

    Android.mk 常用宏和變量
  8. 8

    $(call import-add-path,$(LOCAL_PATH)/libsrc)

    1、解釋:import-add-path

    中文:增加自己的路徑到 NDK_MODULE_PATH 環境變量中,再非ndk根目錄/sources下編譯時會用到

  9. 9

    LOCAL_SRC_FILES := hello-jni.c HelloJni.cpp

    $(error $(LOCAL_SRC_FILES))

    1、解釋:$

    中文:變量前面加上"$"用來返回變量的值

    2、解釋:$(error string)

    中文:用來將string所對應的內容打印到控制檯,並且android.mk文件停止繼續進行編譯,如下圖

    Android.mk 常用宏和變量
  10. 10

    LOCAL_SRC_FILES := hello-jni.c HelloJni.cpp

    $(warning $(LOCAL_SRC_FILES))

    1、解釋:$(warning string)

    中文:用來將string所對應的內容打印到控制檯,並且android.mk文件將繼續進行編譯,如下圖

    Android.mk 常用宏和變量
  11. 11

    LOCAL_PRELINK_MODULE := false  

    1、解釋 LOCAL_PRELINK_MODULE

    中文:關閉編譯器鏈接前進行代碼優化,防止將沒有用到的代碼不添加到生成的庫中

  12. 12

    LOCAL_EXPORT_CFLAGS := -DFOO=1

    1、解釋 LOCAL_EXPORT_CFLAGS

    定義這個變量來記錄一些列的 c/c++編譯標誌,他們將會增加到其他的使用這個模塊的LOCAL_CFLAGS中,LOCAL_CFLAGS的功能相當於:LOCAL_STATIC_LIBRARIES 和 LOCAL_SHARED_LIBRARIES 這兩個變量;

  13. 13

    LOCAL_STATIC_LIBRARIES := foo

    1、解釋 LOCAL_STATIC_LIBRARIES

    鏈接進來一個靜態庫的模塊,這裏是靜態庫的模塊的名稱,而不是靜態庫的名稱

  14. 14

    LOCAL_SHARED_LIBRARIES

    鏈接進來一個動態庫的模塊,這裏是動態庫的模塊的名稱,而不是靜態庫的名稱

  15. 15

    LOCAL_EXPORT_CPPFLAGS

    跟  LOCAL_EXPORT_CFLAGS 的功能一樣,但是它只能夠在c++中使用

  16. 16

    LOCAL_EXPORT_C_INCLUDES

    跟 LOCAL_EXPORT_CFLAGS,但是對於c的 include路徑,被調用模塊申明後,使用模塊可以很方便的使用包含的路徑

  17. 17

    LOCAL_EXPORT_LDFLAGS

    跟LOCAL_EXPORT_CFLAGS的作用一樣,但是僅僅是鏈接選項

  18. 18

    LOCAL_EXPORT_LDLIBS

    跟LOCAL_EXPORT_CFLAGS的作用類似,但是這個變量說明的系統庫,需要帶上 '-l' 前綴,他們將導入鏈接器選項,並追加到你的模塊的  LOCAL_LDLIBS 

  19. 19

    LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

    允許未定義的符號

  20. 20

    LOCAL_CFLAGS

    .c文件對應的編譯標記變量

  21. 21

    LOCAL_LDLIBS

    用來鏈接共享庫(so)或者執行文件,使用系統的庫文件的時候,需要加上前綴 '-l',例如下面的例子,將告訴連接器生成的模塊的時候同時鏈接 /system/lib/libz.so

    LOCAL_LDLIBS := -lz

    注意:如果你在一個模塊中鏈接一個靜態庫,這個靜態庫是不會起作用的,同時ndk-build 會打印出一條警告消息

  22. 22

    LOCAL_CFLAGS    := -fvisibility=hidden

    隱藏庫函數名

  23. 23

    LOCAL_PROGUARD_ENABLED默認是打開的,不特別指定的話,就是起作用的,就可能做優化。

    LOCAL_PROGUARD_ENABLED:= disabled

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章