相同點:都是輕量級 Makefile(Makefile文件定義一些列指令,指定文件編譯順序,類似shell腳本)
Application:
位置:通常在 $PROJECT/jni目錄下
作用:配置所有modules的編譯變量在 APP_ABI := xxx xxx xxx 設(shè)置中間有空格
可以設(shè)置一個或多個ABI對應(yīng)的指令集
指令集合(armeabi,armeabi-v7a,arm64-v8a,x86,x86_64,mips,mips64,all) all全部對應(yīng)
關(guān)于指令集的選擇:
armeabi-v7a兼容armeabi
x86手機(jī)因兼容性基本都使用libhoudini模塊,兼容arm指令集
64位默認(rèn)兼容32位abi的so
所以:對大小嚴(yán)格要求選擇 armeabi,對性能也有要求添加 x86
APP_OPTM(編譯模式)
默認(rèn)release 可修改為debug
Android.mk文件
包含:
1. 宏:my-dir,all-subdir-makefiles等 在$(call <function>)調(diào)用,返回文本信息
2. 變量:CLEAR_VARS,BUILD_SHARED_LIBRARY,TARGET_ARCH等,NDK提供,在Android.mk被解析前存在
3. 模塊描述變量:LOCAL_PATH,LOCAL_MODULE,LOCAL_SRC_FILES等(LOCAL_前綴),除LOCAL_PATH外其余都在include $(CLEAR_VARS)和include $(BUILD_XXX)之間。
LOCAL_PATH(當(dāng)前目錄):
my-dir:通常最后一次包含Makefile文件路徑,通常是Android.mk所在路徑
CLEAR_VARS(變量清除):
除LOCAL_PATH外的其余在include $(CLEAR_VARS)和include $(BUILD_XXX)之間的變量
BUILD_EXECUTABLE
LOCAL_MODULE(module名稱)
LOCAL_SRC_FILE(源碼文件)
BUILD_SHARED_LIBRARY(動態(tài)編譯) BUILD_STATIC_LIBRARY(靜態(tài)編譯)
PREBUILD_SHARED_LIBRARY(動態(tài)預(yù)編譯) PREBUILD_STATIC_LIBRARY(靜態(tài)預(yù)編譯)
BUILD_EXECUTABLE(生成可執(zhí)行的文件)
TARGET_ARCH_ABI(目標(biāo)ABI名稱)
LOCAL_LDLIBS(鏈接庫)
用額外鏈接選項,所有庫都有“-l”前綴,可同時列出空格隔開
LOCAL_CFLAGS,LOCA_CPPFLAGS和LOACL_LDFLAGES(編譯,鏈接標(biāo)志)
LOCAL_CFLAGS: 編譯C/C 傳遞給編譯器的標(biāo)志集合
LCOAL_CPPFLAGS: 只支持C 傳遞給編譯器的標(biāo)志集合
LOCAL_LDFLAGES: 傳遞給連接器的額外參數(shù)
編譯選項格式(LOCAL_CPPFLAGES = XXX)
1.-fexception:NDK異常處理默認(rèn)禁止,可以編譯帶異常處理的C 代碼
2.-ftti:NDK默認(rèn)不支持C RTTI,可以編譯帶RTTI的C 代碼
3.-fvisibility=hidden:隱藏不需要導(dǎo)出的函數(shù),若某個函數(shù)需要導(dǎo)出添加JNIEXPROT或者_(dá)_attribute__((visibility(“default”)))即可
4.-lfunction-section:默認(rèn)編譯文件.o中代碼部分只有.text段,會使每個函數(shù)都單獨
有一個段。對鏈接后代碼大小并沒有影響
5.-fdata-section:同上每個data都有一個單獨的段
6.-Wl—gc-sections:使用連接器ld鏈接時刪除不用的段
-Wl,<option>告訴編譯器,后邊選項<option>傳遞給連接器
7.-fPIC:PIC(position independent code)用于編譯位置無關(guān)代碼,生成可用于共享庫的位置獨立代碼。若不添加-fPIC,加載so文件的代碼段時,代碼段引用的數(shù)據(jù)對象需要重
定位,重定位會修改代碼段內(nèi)容,造成,沒有調(diào)用這個so,代碼段的進(jìn)程在內(nèi)核中會產(chǎn)生著個文件拷貝。
8.-Wall:(wring all)編譯和鏈接中顯示所有警告信息
Android.mk通用格式:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_ARM_MODE := arm
LOCAL_MODULE := helloworld
LOCAL_SRC_FILES := helloworld.c
include $(BUILD_EXECUTABLE)
Application.mk通用格式
APP_ABI := x86 armeabi-v7a
來源:http://www.icode9.com/content-4-222451.html