Android NDK開發指南---Application.mk檔案

來源:互聯網
上載者:User

簡介:
-----------------------------
要將C\C++代碼編譯為SO檔案,光有Android.mk檔案還不行,還需要一個Application.mk檔案。
本文檔是描述你的Android應用程式中需要的本地模組的Application.mk的文法使用,要明白如下。

Application.mk目的是描述在你的應用程式中所需要的模組(即靜態庫或動態庫)。

Application.mk檔案通常被放置在$PROJECT/jni/Application.mk下,$PROJECT指的是您的項目。

另一種方法是將其放在頂層的子目錄下:
$NDK/apps目錄下,例如:
$NDK/apps/<myapp>/Application.mk

<myapp>是一個簡稱,用於描述你的NDK編譯系統的應用程式(這個名字不會產生共用庫或者最終的包)

下面是Application.mk中定義的幾個變數。

APP_PROJECT_PATH
這個變數是強制性的,並且會給出應用程式工程的根目錄的一個絕對路徑。這是用來複製或者安裝一個沒有任何版本限制的JNI庫,從而給APK產生工具一個詳細的路徑。

APP_MODULES
這個變數是可選的,如果沒有定義,NDK將由在Android.mk中聲明的預設的模組編譯,並且包含所有的子檔案(makefile檔案)
如果APP_MODULES定義了,它不許是一個空格分隔的模組列表,這個模組名字被定義在Android.mk檔案中的LOCAL_MODULE中。注意NDK會自動計算模組的依賴

注意:NDK在R4開始改變了這個變數的行為,再次之前:
 - 在您的Application.mk中,該變數是強制的
 - 必須明確列出所有需要的模組

APP_OPTIM
這個變數是可選的,用來定義“release”或"debug"。在編譯您的應用程式模組的時候,可以用來改變優先順序。

“release”模式是預設的,並且會產生高度最佳化的二進位代碼。"debug"模式產生的是未最佳化的二進位代碼,但可以檢測出很多的BUG,可以用於調試。

注意:如果你的應用程式是可調試的(即,如果你的資訊清單檔中設定了android:debuggable的屬性是"true")。預設的是"debug"而不是"release"。這可以通過設定APP_OPTIM為"release"來將其覆蓋。

注意:可以在"release"和"debug"模式下一起調試,但是"release"模式編譯後將會提供更少的BUG資訊。在我們清楚BUG的過程中,有一些變數被最佳化了,或者根本就無法被檢測出來,代碼的重新排序會讓這些帶阿彌變得更加難以閱讀,並且讓這些軌跡更加不可靠。

APP_CFLAGS
當編譯模組中有任何C檔案或者C++檔案的時候,C編譯器的訊號就會被發出。這裡可以在你的應用中需要這些模組時,進行編譯的調整,這樣就不許要直接更改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
+
+ 使用'-l../bar/'將不會工作,以為它將等同於"-l$NDK_ROOT/../bar"
++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++
注意:在Android的NDK 1.5_r1,只適用於C源檔案,而不適合C++。
這已得到糾正,以建立完整相匹配的Andr​​oid系統。

APP_CXXFLAGS
APP_CPPFLAGS的別名,已經考慮在將在未來的版本中廢除了

APP_CPPFLAGS
當編譯的只有C++源檔案的時候,可以通過這個C++編譯器來設定

注意:在Android NDK-1.5_r1中,這個標誌可以應用於C和C++源檔案中。並且得到了糾正,以建立完整的與系統相匹配的Android編譯系統。你先可也可以使用APP_CFLAGS來應用於C或者C++源檔案中。
建議使用APP_CFLAGS

APP_BUILD_SCRIPT
預設情況下,NDK編譯系統會在$(APP_PROJECT_PATH)/jni目錄下尋找名為Android.mk檔案:
$(APP_PROJECT_PATH)/jni/Android.mk

如果你想覆蓋此行為,你可以定義APP_BUILD_SCRIPT來指定一個備用的編譯指令碼。一個非絕對路徑總是被解釋為相對於NDK的頂層的目錄。

APP_ABI
預設情況下,NDK的編譯系統回味"armeabi"ABI產生機器代碼。喜愛哪個相當於一個基於CPU可以進行浮點運算的ARMv5TE。你可以使用APP_ABI來選擇一個不同的ABI。

比如:為了在ARMv7的裝置上支援硬體FPU指令。可以使用
APP_ABI := armeabi-v7a

或者為了支援IA-32指令集,可以使用
APP_ABI := x86

或者為了同時支援這三種,可以使用
APP_ABI := armeabi armeabi-v7a x86

APP_STL
預設情況下,NDK的編譯系統為最小的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

下面是一個Application.mk檔案的樣本:
APP_PROJECT_PATH := <path to project>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.