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.