Android.mk小结,讲的比较详细

Android.mk结构
多目录Android.mk包含语句
设置头文件搜索路径
设置需要链接的动态库
导出模块头文件路径
导出模块依赖关系
预编译
实例

Android.mk规则在NDK中有文档ANDROID-MK说明,我觉得了解了基本规则的人都要去看一下,以便灵活运用.

1.Android.mk结构:

LOCAL_PATH:=$(call my-dir) 
include $(CLEAR_VARS)
LOCAL_MODULE:=module_name 
LOCAL_SRC_FILES:=srcfile1.cpp srcfile2.cpp 
include $(BUILD_SHARED_LIBRARY) 

说明:

LOCAL_PATH:=$(call my-dir) #设置当前编译目录(包含此Android.mk的目录)
include $(CLEAR_VARS) #清除LOCAL_XXX变量,LOCAL_PATH除外
LOCAL_MODULE:=module_name #模块名字,不能包含空格,唯一
LOCAL_SRC_FILES:=srcfile1.cpp srcfile2.cpp #模块编译需要的c或cpp文件
include $(BUILD_SHARED_LIBRARY) #BUILD_SHARED_LIBRARY指定编译成动态库,BUILD_STATIC_LIBRARY指定生成静态库,BUILD_EXECUTEABLE指定生成可执行文件.
只有动态库才能被打包到安装包中,静态库可以用来生成动态库.

2.多目录Android.mk包含语句
包含指定的目录下的Android.mk
include $(call all-makefiles-under,指定目录)
通常是这样用的:include $(call all-makefiles-under,$(LOCAL_PATH))

包含所有当前目录中子目录的Android.mk(注意,这种方式运行于当前目录没有编译模块,不然在编译完当前目录模块后,不会再到子目录去了).
include $(call all-subdir-makefiles) 

包含语句必须放在Android.mk文件的末尾:
IMPORTANT NOTE: Due to the way GNU Make works, this really returns
the path of the *last* *included* *Makefile* during the parsing of
build scripts. Do not call my-dir after including another file.
不要在包含别的Android.mk后再调用call my-dir,会出错的,因此...如果需要包含别的Android.mk,需要放到末尾.


3.设置头文件搜索路径:
当前目录会被默认搜索(不包含子目录),设置其他位置的头文件查找路径:
LOCAL_C_INCLUDES:= $(ANDROID_SOURCE)/frameworks/av/include
LOCAL_C_INCLUDES+= $(ANDROID_SOURCE)/frameworks/base/include

设置需要链接的动态库
LOCAL_LDLIBS:=-Llibspath -lxxx -lyyy ... #libspath是库所在路径,xxx和yyy是库

指定链接Android.mk中定义的模块(如果xxx没有被编译好,它会先被编译):
LOCAL_SHARED_LIBRARIES:=module_name #指定动态库
LOCAL_STATIC_LIBRARIES:=module_name #指定静态库

5.导出模块头文件路径:
LOCAL_EXPORT_C_INCLUDES:=module_include
这个主要用来输出当前模块的头文件所在路径,其他模块如果依赖它,就不需要指定它的头文件路径了.

6.导出模块依赖关系:
LOCAL_EXPORT_LDLIBS:= -lxxx -lyyy
当用静态库生成动态库时,可以用此方法设置静态库的依赖环境,一般用法是:
LOCAL_EXPORT_LDLIBS:=$(LOCAL_LDLIBS) #上面提到用LOCAL_LDLIBS设置链接路径的好处就在这里,可以直接导出库和库所在的路径.

7.预编译,目的是为了在Android.mk中生成一个模块名字.
include $(PREBUILT_SHARED_LIBRARY)
include $(PREBUILT_STATIC_LIBRARY)
主要用来包含第三方库,为第三方库在Android.mk中创建模块名字,被其他库使用.使用这种编译时,LOCAL_SRC_FILES中指向一个动态库,并且最后被打包到安装包里的库会是这个动态库.


实例:

一个播放器的native代码,模块有:

    ffmpeg库(第三方库),androidvideo库,androidaudio库,androidomx库,ffmpeg-jni库

依赖关系:

    ffmpeg是由ffmpeg源码使用makefile生成.

    ffmpeg-jni依赖于前面四个模块,androidomx库依赖于ffmpeg库.

思路:

    将ffmpeg库编译成预编译模块,以供ffmpeg-jni和androidomx使用

    将androidomx,androidaudio,androidvideo生成静态库,并导出头文件路径和依赖关系,以供ffmepg-jni使用

    最后生成ffmpeg-jni库和ffmpeg库

文件结构说明:

jni
jni/android_omx 
jni/android_video 
jni/android_audio

-----------------------------------------------------------------------------------------------------------------

#jni/Android.mk

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := android-ffmpeg
LOCAL_SRC_FILES := ffmpeg-build/$(TARGET_ARCH_ABI)/libffmpeg.so
LOCAL_EXPORT_C_INCLUDES := ffmpeg-build/$(TARGET_ARCH_ABI)/include
LOCAL_ARM_NEON:=true
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE:=ffmpeg-jni
LOCAL_SRC_FILES:=ffmpeg-jni.cpp player.cpp fast_queue.cpp
LOCAL_LDLIBS:=-llog -lz -lm -landroid
LOCAL_SHARED_LIBRARIES:=android-ffmpeg
LOCAL_STATIC_LIBRARIES:=androidvideo androidaudio omxdecoder
include $(BUILD_SHARED_LIBRARY)

include $(call all-makefiles-under,$(LOCAL_PATH))

---------------------------------------------------------------------------------------------------------------------------------------

#jni/android_video/Android.mk

LOCAL_PATH:=$(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE:=androidvideo
LOCAL_SRC_FILES:=androidvideo_surface.cpp
MY_ANDROID_SOURCE:=/media/d/android/jb4.1.2
MY_ANDROID_LIBS:=/media/d/android/jb4.1.2_libs
LOCAL_C_INCLUDES:= $(MY_ANDROID_SOURCE)/frameworks/av/include
LOCAL_C_INCLUDES+= $(MY_ANDROID_SOURCE)/frameworks/base/include
LOCAL_C_INCLUDES+= $(MY_ANDROID_SOURCE)/frameworks/native/include
LOCAL_C_INCLUDES+= $(MY_ANDROID_SOURCE)/frameworks/native/include/media/openmax
LOCAL_C_INCLUDES+= $(MY_ANDROID_SOURCE)/system/core/include
LOCAL_C_INCLUDES+= $(MY_ANDROID_SOURCE)/hardware/libhardware/include

LOCAL_LDLIBS:= -L$(MY_ANDROID_LIBS) -L$(LOCAL_PATH)/../ffmpeg-build/armeabi-v7a -llog -landroid_runtime -lmedia -lstagefright -landroid -lcutils -lui -lgui -lutils -lbinder
LOCAL_CPPFLAGS:=-Wno-multichar

LOCAL_EXPORT_C_INCLUDES:=$(LOCAL_PATH)
LOCAL_EXPORT_LDLIBS:=$(LOCAL_LDLIBS)

include $(BUILD_STATIC_LIBRARY)

android_omx,android_audio目录下的Android.mk和上面类似,不再列出.
中间会生成libandroidomx.a libandroidvideo.a libandroidaudio.a
最终生成的动态库是libffmpeg-jni.so和libffmpeg.so.

你可能感兴趣的:(Android.mk小结,讲的比较详细)