Android.mk 详解

Android.mk是Android提供的一个makefile文件,可以将源文件分组为模块。用来引用的头文件目录、需要编译的.c/.cpp文件、jni源文件、指定编译生成*.so共享库文件或者*.a静态库文件,可以定义一个或多个模块,也可以多个模块中使用同一个源文件;

一、Android.mk文档

  1. Android.mk的官方文档https://developer.android.google.cn/ndk/guides/android_mk
  2. 在NDK中的文档路径
    ndk目录下docs中的ANDROID-MK.html文档,eg:android-ndk-r9d/docs/ANDROID-MK.html;

二、基础知识:

  1. LOCAL_PATH := $(call my-dir)

每个Android.mk文件都以LOCAL_PATH开始,Build System提供的宏函数 my-dir,此变量返回包含的makefile的路径;
CLEAR_VARS不会清楚LOCAL_PATH变量;

  1. include $(CLEAR_VARS):

CLEAR_VARS变量由Build System提供,并指向一个特定的GNU Makefile,可为你清除LOCAL_xxx变量,但不会清除LOCAL_PATH变量;
因系统在单一GNU Make执行环境中解析所有构建控制文件,LOCAL_xxx变量是全局的,所以描述每个模块之前,声明此变量,可以清除所有了LOCAL_xxx,这样清理后避免相互影响;

  1. LOCAL_MODULE:= xxxx

此变量声明模块名称,名称必须唯一且不含任何空格;
Build System在生成最终共享库文件时,会将"lib"作为前缀+模块名称+".so"作为共享库文件名称;
比如:LOCAL_MODULE := ffmpegPlayer
模块名称为ffmpeg-decoder生成共享库为libffmpegPlayer.so;

  1. LOCAL_SRC_FILES

此变量必须包含要构建到模块中的C/C++源文件列表,不需要列出头文件和包含文件,系统会自动导入依赖;
LOCAL_SRC_FILES :=FFmpegDecoder.cpp FFmpegConfigure.cpp
也可以这么写
LOCAL_SRC_FILES:= \
LOCAL_SRC_FILES += (wildcard(LOCAL_PATH)/*.cpp)

  1. LOCAL_C_INCLUDES

变量设置头文件的include目录列表;
LOCAL_C_INCLUDES += $(LOCAL_PATH)/include

  1. LOCAL_LDLIBS

此变量包含构建共享库或可执行文件时链接库,使用-l前缀传递特定系统库的名称,多个链接库之间使用空格作为分隔符;
变量列表:
-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参考文档;
例子:LOCAL_LDLIBS := -llog -lz

7.include $(BUILD_SHARED_LIBRARY)

include $(BUILD_STATIC_LIBRARY)表示编译成静态库
include $(BUILD_SHARED_LIBRARY)表示编译成动态库。
include $(BUILD_EXECUTABLE)表示编译成可执行程序
include $(BUILD_PREBUILT)表示把文件当成编译项目
一般我们作为外部引用库都会生成动态库.so文件,所以一般都会用BUILD_SHARED_LIBRARY

推荐阅读更多精彩内容

  • Android游戏开发实践(1)之NDK与JNI开发02 承接上篇Android游戏开发实践(1)之NDK与JNI...
    AlphaGL阅读 2,945评论 0 24
  • 概述 文件用来向编译系统描述如何编译你的源代码。更确切地说,该文件其实就是一个小型的Makefile。由于该文件会...
    FANZY_d3fa阅读 611评论 0 0
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 1,319评论 0 3
  • Android.mk文件用来告知NDK Build 系统关于Source的信息。 Android.mk将是GNU ...
    IT小魔女的故事阅读 387评论 0 3
  • 贴一篇旧文 鱼唇里挤出来半个泡泡,衔着泡泡的嘴微微翕动,眼睛像个亮晶晶的贴片,有点点惊讶。一口气吐出了泡泡摆了摆身...
    孙铁柱阅读 48评论 0 0