NDK Application.mk使用手冊

本文檔從NDK安裝目錄下的說明文檔翻譯而來,位置:$NDK/docs/APPLICATION-MK.html
1 概述

Application.mk用來描述你的工程下的native模塊, 一般放在$PROJECT/jni/Application.mk, 其中$PROJECT表示你的工程目錄,這樣就可以被ndk-build腳本文件找到.(注:在這種方式下,進入jni目錄,即$PROJECT/jni/,然後執行ndk-build,就可以直接編譯jni生成.so文件了).

還有另外一種方法就是將Application.mk文件放在$NDK/app/<myapp>/Application.mk,其中$NDK爲NDK的安裝目錄,<myapp>爲你的應用程序名.在這種方式下,進入$NDK安裝目錄,然後輸入make APP=<name>,即可編譯你的JNI代碼.此種方法是ndk-r4之前的方法,雖然出於兼容的原因目錄還支持,但是不建議使用此種方法,因爲第一種方法簡單,且方便.

在Application.mk文件內定義了一些變量:
APP_PROJECT_PATH

此變量值必須是你工程根目錄的絕對路徑.這用於指定JNI生成的.so文件安裝路徑或拷貝路徑.

注:此變量對於第一種方法是可選了,但對於第二種方法卻是必須的.
APP_MODULES

模塊名

此變量是可選的,如果沒有在此文件中定義,則默認由Android.mk文件決定.

如果在Application.mk文件中定義此變量,那麼它必須是一串由空格相隔的模塊名列表,並且與Android.mk文件中的LOCAL_MODULE變量定義保持一致.需要注意地是,NDK會自動計算模塊所需要的依賴文件。

注:此變量在NDK R4版本之前是在Application.mk中是必須的,所有模塊必須顯式地列出.

APP_OPTIM

優化選項

此變量是可選的,其值可以爲’release’或’debug’.此變量用來修改優先等級.默認情況下爲release.在release模式下,將編譯生成被優化了的二進制的機器碼,而debug模塊用來生成便於調試的未被優化的二進制機器碼。

需要注意地是,如果你的程序在manifest文件中的節點下已經設置了android:debuggable屬性爲”true”,則Apllication.mk文件此變量的默認值則爲’debug’而不是’release’,可以在Application.mk文件中將此變量值設置爲’release’而覆蓋其值.

雖然在兩種模塊下都可以調試,但是release模式下提供更少的調試信息,比如:一些變量被優化從而不能被檢查,代碼重組,及跟蹤。
APP_CFLAGS

編譯選項

可以在Application.mk文件中修改此編譯選項參數,此參數可以覆蓋Android.mk文件中的相同定義,從而不必去Android.mk文件中修改.

需要注意地是,這個選項裏的路徑必須是以頂層NDK目錄爲相對路徑,如存在以下兩個文件:

sources/foo/Android.mk

sources/bar/Android.mk

如果在foo/Android.mk文件中想要添加bar目錄,那麼得這樣便用:

APP_CFLAGS += -Isources/bar

如果這樣使用:

APP_CFLAGS += -I$(LOCAL_PATH)/../bar

將會變成’-I$NDK_ROOT/../bar’,從而出現並不是你想要的結果.

在android-ndk-1.5_r1時,此選項中只在C代碼中被支持,而C++不支持,不過現在已經被糾正了.

APP_CXXFLAGS

APP_CPPFLAGS的別名,將來此變量將會被拋棄。

APP_CPPFLAGS
C++代碼的編譯選項。在android-ndk-1.5_r1版本中,此變量只適用於C++,但是現在可以同時適用於C和C++。

APP_BUILD_SCRIPT
在默認情況下,NDK會在jni目錄下查找Android.mk文件並使用它,如果你想修改它,那麼在此變量中你可以指定一個你自己的腳本來執行,路徑還是以工程頂層目錄爲相對路徑.

APP_ABI
在默認情況下,NDK會使用’armeabi’ ABI 來生成二進制機器碼,這是基於ARMv5TE的浮點運算CPU,這可以通過使用此變量來選項不同的ABI(Application Binary Interface).

例如:支持基於armv7 FPU指令集的設備:

APP_ABI := armeabi-v7a

支持IA-32指令集:

APP_ABI := x86

同時支持三種:

APP_ABI := armeabi armeabi-v7a x86

從NDK-r7版本後,同時支持三種還可以這樣寫:

APP_ABI := all

有關ABI更詳細的內容請參考文檔:docs/CPU-ARCH-ABIS.html

APP_STL
C++標準庫

在默認情況下,NDK通過Androoid自帶的最小化的C++運行庫(system/lib/libstdc++.so)來提供標準C++頭文件.然而,NDK提供了可供選擇的C++實現,你可以通過此變量來選擇使用哪個或鏈接到你的程序。

APP_STL := stlport_static –> static STLport library
APP_STL := stlport_shared –> shared STLport library
APP_STL := system –> default C++ runtime library

更多詳細內容請參考文檔docs/CPLUSPLUS-SUPPORT.html。

APP_GNUSTL_FORCE_CPP_FEATURES
在先前的NDK版本中,當使用GNU libstdc++ runtime運行庫(通過設置APP_STL變量爲gnustl_static或gnustl_shared)都會強制支持異常和RTTI,在有些極少情況下可能會出現問題,同時會使生成的機器碼包含不必須的內容。

這種問題在NDK r7b中得到解決,但是這也意味着如果你真的需要支持異常和RTTI 的話,則必須顯式聲明。要麼通過APP_CPPFLAGS,要麼通過LOCAL_CPPFLAGS,或LOCAL_CPP_FEATURES。本變量就是爲了解決此問題的.

有兩個選項供選擇,也可同時都選擇.

exceptions -> 強制所有模塊支持異常.
rtti -> 強制所有模塊支持rtti.

例如:

APP_GNUSTL_FORCE_CPP_FEATURES := exceptions rtti

注意:此變量是過濾變量,將來有可能不支持.所以建議不使用此變量.

發佈了21 篇原創文章 · 獲贊 12 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章