您的位置:首页 > 移动开发 > Android开发

Android.mk 小结

2015-11-19 16:29 344 查看
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