一. Android.mklinux
1.1. 什麼是.mkandroid
Android.mk是Android提供的一個makefile文件,能夠將源文件分組爲模塊。用來引用的頭文件目錄、須要編譯的*.c/*.cpp文件、jni源文件、指定編譯生成*.so共享庫文件或者*.a靜態庫文件,能夠定義一個或多個模塊,也能夠多個模塊中使用同一個源文件app
1.2. .mk語法ide
1.2.1. LOCAL_PATH := $(call my-dir)函數
每一個Android.mk文件都以LOCAL_PATH開始,Build System提供的宏函數 my-dir,此變量返回包含的makefile的路徑;工具
1.2.2. include $(CLEAR_VARS):oop
CLEAR_VARS變量由Build System提供,並指向一個特定的GNU Makefile,可爲你清除LOCAL_xxx變量,但不會清除LOCAL_PATH變量;ui
因系統在單一GNU Make執行環境中解析全部構建控制文件,LOCAL_xxx變量是全局的,因此描述每一個模塊以前,聲明此變量,能夠清除全部了LOCAL_xxx,這樣清理後避免相互影響;spa
1.2.3. LOCAL_MODULE日誌
此變量聲明模塊名稱,名稱必須惟一且不含任何空格;
Build System在生成最終共享庫文件時,會將"lib"做爲前綴+模塊名稱+".so"做爲共享庫文件名稱;
eg:LOCAL_MODULE := ffmpeg-decoder
模塊名稱爲ffmpeg-decoder生成共享庫爲libffmpeg-decoder.so;
1.2.4. LOCAL_SRC_FILES := FFmpegDecoder.cpp FFmpegConfigure.cpp
此變量必須包含要構建到模塊中的C/C++源文件列表,不須要列出頭文件和包含文件,系統會自動導入依賴;
eg: LOCAL_SRC_FILES := FFmpegDecoder.cpp FFmpegConfigure.cpp
1.2.5. LOCAL_C_INCLUDES
變量設置頭文件的include目錄列表;
eg: LOCAL_C_INCLUDES += $(LOCAL_PATH)/include
1.2.6. LOCAL_LDLIBS
此變量包含構建共享庫或可執行文件時連接庫,使用-l前綴傳遞特定系統庫的名稱,多個連接庫之間使用空格做爲分隔符;
NDK爲Android版本提供新的頭文件和庫,文件路徑:$NDK/platforms/android-<level>/<abi>/usr/include下;
-llog連接到系統的liblog.so文件,應用能夠定義從原生代碼向內核發送日誌消息,路徑:/system/lib/liblog.so,實際上是導入<android/log.h>頭文件,路徑:$NDK/platforms/android-3/arch-arm/usr/include/android/log.h
變量列表:
-llog(日誌庫):導入log.h頭文件
-lz(ZLib壓縮庫):添加zlib.h和zconf.h頭文件;
-ldl(動態連接器庫):添加dlfcn.h頭文件,能夠訪問Android動態連接器的dlopen()、dlsym()和dlclose()函數;
-lGLESv3(OpenGL ES3.1庫):此變量API 21開始,添加gl31.h和gl3ext.h頭文件,提供了渲染機制,參考EGL原平生臺接口;從API 9開始提供EGL API,能夠使用GLSurfaceView;
-ljnigraphics:容許C/C++以可靠方式訪問Java位圖對象的像素緩衝區,導入bitmap.h頭文件,jnigraphics工做流程參考:NDK API中的jnigraphics;
-lOpenMAXAL(多媒體庫):導入OMXAL/OpenMAXAL.h和
OMXAL/OpenMAXAL_Platform.h頭文件,提供原生多媒體處
理庫;
-landroid(android原生頭文件庫): 原生頭文件列表包括native_activity.h、looper.h、input.h、keycodes.h等等,如需瞭解頭文件詳情參考:NDK API參考文檔;
eg:LOCAL_LDLIBS := -llog -lz
1.3. .mk實例
LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := ./oled_test.c LOCAL_SHARED_LIBRARIES := liblog libcutils LOCAL_MODULE := oled_test LOCAL_MODULE_TAGS := optional LOCAL_MODULE_PATH := /home/network_share/test/oled include $(BUILD_EXECUTABLE)
二. 編譯
2.1. 早期的linux編譯app是須要設置交叉編譯鏈工具,如今安卓開發中,再也不須要配置gcc,而是直接使用安卓編譯環境
2.2. source ./build/envsetup.sh
2.3. lunch 如今相應版本
2.4. mmm external/yf_test/