MakeFile介紹
NDK中的MakeFile有Application.mk和Android.mk兩個文件組成析苫,
Application.mk是對整個項目的全局性描述,比如編譯的平臺锻煌,編譯的優(yōu)化選項等;Android.mk是項目中某一個模塊的編譯腳本,在其中指定Module的名稱,需要編譯的代碼文件痰催,以及需要包含的頭文件等兜辞。
Application.mk
Application.mk 相對較少迎瞧,我們一般只需要關(guān)注以下幾個常用的選項
- APP_ABI
用來指定需要編譯的平臺,如果我們的so就是在手機上使用逸吵,armeabi-v7a
基本上可以適配大部分手機了凶硅,部分x86平臺的手機內(nèi)部有個轉(zhuǎn)化器,會自動把arm的指令轉(zhuǎn)化到x86平臺扫皱,當(dāng)然這有一定的性能損耗足绅。
APP_ABI := armeabi-v7a
- APP_PLATFORM
用來指定Android 平臺的版本,不同的版本差異主要是有些系統(tǒng)庫不能在低版本使用韩脑,比如opengles v2版本需要在Android 2.0以上使用氢妈,如果需要使用opengles v2,需要設(shè)置APP_PLATFORM為android-5:
APP_PLATFORM := android-5
- APP_STL
用來指定C++標準庫的不同實現(xiàn)段多,默認值是libstdc++首量,是最基本版本的C++標準庫實現(xiàn),可能我們的代碼中用到了libstdc++不支持的函數(shù)进苍,我們需要指定其他實現(xiàn):
APP_STL := gnustl_static
- APP_PROJECT_PATH
指定項目的路徑加缘,一般我們的項目是放在jni目錄下的,可以不用指定觉啊。
- APP_BUILD_SCRIPT
指定NDK編譯腳本的文件名稱拣宏,如果編譯腳本名稱為Android.mk, 可以不用指定。
Android.mk
基礎(chǔ)結(jié)構(gòu)
Android.mk編寫我們一般有一些固定的順序, 以下是最簡單的Android.mk結(jié)構(gòu)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := test
LOCAL_SRC_FILES := test.c
include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH := $(call my-dir)
設(shè)置當(dāng)前的代碼路徑杠人,LOCAL_PATH指向Android.mk所在的目錄include $(CLEAR_VARS)
清除LOCAL_xxx指定的變量勋乾,清理后才能避免多個模塊相互影響LOCAL_MODULE := test
指定當(dāng)前模塊的名稱為test,生成后的文件為libtest.soLOCAL_SRC_FILES := test.c
指定需要編譯的源碼文件嗡善,不需要列出頭文件include $(BUILD_SHARED_LIBRARY)
編譯生成動態(tài)鏈接庫
引用外部動態(tài)鏈接庫
首先中Android.mk文件中將共享庫聲明為一個獨立的模塊
include $(CLEAR_VARS)
LOCAL_MODULE := avcodec
LOCAL_SRC_FILES := prebuilt/ffmpeg/libavcodec.so
include $(PREBUILT_SHARED_LIBRARY)
在自己的模塊中再使用以下代碼引用這個模塊
LOCAL_C_INCLUDES := prebuilt/ffmpeg/include/
LOCAL_SHARED_LIBRARIES:=avcodec
LOCAL_C_INCLUDES := prebuilt/ffmpeg/include/
使用外部動態(tài)庫市俊,編譯需要用到外部庫的頭文件LOCAL_SHARED_LIBRARIES:=avcodec
指定當(dāng)前模塊需要引用的共享鏈接庫模塊
使用系統(tǒng)庫
如果我們在代碼中需要使用系統(tǒng)庫,比如LOG庫滤奈,我們需要加入以下代碼, 就可以引用系統(tǒng)的/system/lib/liblog.so了摆昧。
LOCAL_LDLIBS := -llog