Android.mk详细介绍

来源:互联网 发布:中国的软件行业 编辑:程序博客网 时间:2024/04/30 17:36

Android.mk 的含义

LOCAL_PATH:=$(call my-dir)

LOCAL_PATH 是定义源文件在哪个目录用的。my-dir 是个定义的宏方法,$(call my-dir)就是调用这个叫 my-dir的宏方法,这个方法返回值就是Android.mk文件所在的目录。

 

LOCAL_PATH := $(call my-dir) 这句用来指定编译的路径。通过调用宏 my-dir ,获取到当前工作的路径。

 

include $(CLEAR_VARS)

CLEAR_VARS 变量是build system里面的一个变量,这个变量指向了所有的类似 LOCAL_XXX的变量,执行完这一句话, 这个编译系统就把所有的类似

 

LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES,...这样的变量都清除掉

 

但是不会清除掉 LOCAL_PATH;

 

这个变量是编译系统提供的,用来指明一个 GNU makefile 文件,添加这句,主要的目的是清理所有的 LOCAL_XXX. ,比如 LOCAL_MODULE , LOCAL_LDLIBS 。在每个新模块的开始处,需要添加这句。

 

类似工具的初始化的操作;

 

LOCAL_MODULE

LOCAL_MODULE  就是你要生成的库的名字,这个名字要是唯一的。不能有空格。编译后系统会自动在前面加上lib的头, 比如说我们的Hello 就编译成了libHello.so,还有个特点就是如果你起名叫libHello 编译后ndk就不会给你的module名字前加上lib了,但是你最后调用的时候 还是调用Hello这个库。

 

LOCAL_SRC_FILES = :Hello.c

 

这个是指定你要编译哪些文件,不需要指定头文件 ,引用哪些依赖, 因为编译器会自动找到这些依赖 自动编译

 

include $(BUILD_SHARED_LIBRARY)  BUILD_STATIC_LIBRARY

 

这句定义了模块名称,将来编译的库就以此命名。若果编译的是动态库,那么库名就是 libmyjni.so. 需要注意的是,如果你定义 module 为 libmyjni ,那么系统在生成动态库的时候,就不要再为你添加 lib 的前缀了,生成德动态库名字还是 libmyjni.so.

 

多个文件用逗号隔开;

 

LOCAL_LDLIBS += -llog

这句指定了需要另外链接的库。我们在代码中,用到了 log 库,所以这里加上这句。

include $(BUILD_SHARED_LIBRARY)

这句说明将来生产的库是共享库,及动态链接库。若需要生产静态库,可以这样写: include $(BUILD_STATIC_LIBRARY) 。动态库的体积比较小,依赖性比价强,扩展名为.so;静态库的体积比较大,扩展名为.a;

.so

编译后生成的库的类型,如果是静态库.a 配置include $(BUILD_STATIC_LIBRARY)

 

其它参数

LOCAL_CPP_EXTENSION := cc //指定c++文件的扩展名

LOCAL_MODULE    := ndkfoo

LOCAL_SRC_FILES := ndkfoo.cc

LOCAL_LDLIBS += -llog -lvmsagent -lmpnet -lmpxml -lH264Android

//指定需要加载一些别的什么库.