android ndk 之Android.mk编写

来源:互联网 发布:数据迁移方案101data 编辑:程序博客网 时间:2024/06/04 18:31

http://hi.baidu.com/benbearlove/blog/item/84b48bfad433cd3e4f4aeaf7.html

最近在移植一个linux下的c库到android,学习编写Android.mk文件,特地花了点时间学习。

 

在网上搜了很多,最后发现还是看ndk的文档最直接,也最全面,下面的总结主要是根据ndk提供的文档编写的。

 

1、单一的Android.mk文件:

 

   LOCAL_PATH := $(call my-dir)   include $(CLEAR_VARS)   LOCAL_MODULE    := hello-jni   LOCAL_SRC_FILES := hello-jni.c   include $(BUILD_SHARED_LIBRARY)

 

LOCAL_PATH必须位于Android.mk文件的最开始。它是用来定位源文件的位置,$(call my-dir)的作用就是返回当前目录的路径。

 

include $(CLEAR_VARS)的作用是清除一些变量的值,但是LOCAL_PATH除外。

 

LOCAL_MODULE是用来指定当前待编译模块的名称,在示例中的模块名称为hello-jni

 

LOCAL_SRC_FILES是用来指定参与编译的源代码文件。这里只编译hell0-jin.c

 

include $(BUILD_SHARED_LIBRARY)是用来指示将当前模块编译为共享库,前缀为lib,后缀为.so。

还有另外一个BUILD_STATIC_LIBRARY,是用来指示将当前模块编译为静态库的,前缀为.a,后缀为.a。

 

这就是一个最简单的Android.mk的结构。可能还有另外一点需要介绍:

LOCAL_C_INCLUDES:=include 这个是用来指定在编译时即将使用的c头文件的位置,以当前目录为起点。

 

2、定义多个Android.mk文件。

有的时候,需要编译的模块比较多,我们可能会将对应的模块放置在相应的目录中,这样,我们可以在每个目录中定义对应的Android.mk文件(类似于上面的写法),最后,在根目录放置一个Android.mk文件,内容如下:

 

include $(call all-subdir-makefiles)

 

只需要这一行就可以了,它的作用就是包含所有子目录中的Android.mk文件

 

3、也可以在一个Android.mk文件里包含多个模块。

很直观的想法就是将第一个Android.mk文件的内容复制一份,然后修改。我最开始也是这样做的,但是后来出现问题了,在第二个模块中的源码找不到,最后还是看文档,发现里面已经有示例解释了:

 

 LOCAL_PATH := $(call my-dir)

 

 

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.

 

大意是:基于GNU make的工作方式,$(call my-dir)会返回在解析build脚本时,遇到的最后一个 include中涉及的目录。

 

所以,很多时候,在这个Android.mk里面只需要调用一次$(call my-dir)就够了,如果所有的源文件都在一个目录中。

 

如果需要的话,可以在第一次调用call my-dir的时候,将值保存下来,比如:

 

MY_LOCAL_PATH := $(call my-dir)

 

 

LOCAL_PATH := $(MY_LOCAL_PATH)

 

然后,在另外一个模块中,继续如下定义:

 

LOCAL_PATH := $(MY_LOCAL_PATH)

 

 

 

在编译一般的c源代码时,上面的基本可以满足了,等后面需要,再继续补充吧!

 

 

补充:

关于LOCAL_CFLAGS

在某些时候,编译源码需要定义宏变量,这个时候,我们可以直接在对应的源码里面去修改,但也有一些情况,我们是没法在别人的源码里定义宏变量的,这个时候,就需要使用到LOCAL_CFLAGS 了 ,举例如下:

 

LOCAL_CFLAGS  += -D__FAVOR_BSD

 

这行代码的作用就是在原有的cflags基础上,再定义一个宏变量__FAVOR_BSD

 

类似于#define __FAVOR_BSD


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 当兵的体能太差怎么办 药流第二天出血怎么办 在部队当兵硬了怎么办 窦性心率过缓怎么办 武装突袭3卡顿怎么办 战队副本打完了怎么办 新兵连晚上饿了怎么办 运动后恶心想吐怎么办 运动后反胃想吐怎么办 魔域服务器满了怎么办 魔域忘记哪个区怎么办 魔域快捷键锁了怎么办 宝宝走路o型腿怎么办 走路多了腿疼怎么办 孩子与父母相冲怎么办 压片机冲模锈了怎么办 宝宝腹泻10多天怎么办 10个月宝宝腹泻怎么办 5岁宝宝很叛逆怎么办 6岁了不会写字怎么办 宝宝1岁不爱吃饭怎么办 l岁宝宝不吃饭怎么办 1岁宝宝不肯吃饭怎么办 10岁儿童不吃饭怎么办 2周岁宝宝不吃饭怎么办 9个月小孩不吃饭怎么办 孩子被老师打了怎么办 孩子说老师打她怎么办 孩子的数学太差怎么办 2岁宝宝老要喝水怎么办 分手了还想她怎么办 5岁宝宝不会说话怎么办 2岁半宝宝说话晚怎么办 7岁儿童发烧39度怎么办 感冒发烧怎么办简单的退烧方法 生完孩子没奶水怎么办 梦见让狐狸咬了怎么办 1岁宝宝不吃辅食怎么办 母乳不够宝宝不吃奶粉怎么办 吃母乳的宝宝不吃奶粉怎么办 宝宝吃母乳不吃奶粉怎么办