高通android.mk 编写

本文深入解析Android.mk文件中模块构建的关键参数及其应用,包括共享库、静态库、应用与资源的增加,以及多模块构建与标签使用。详细解读LOCAL_PATH、LOCAL_MODULE等核心变量的作用,并探讨不同模块类型的目标文件夹路径,同时介绍如何通过定义多个Android.mk文件或在一个文件中包含多个模块来优化构建流程。最后,提供关键性标签体系结构指引,帮助开发者更高效地组织与管理代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

增加共享库:

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS)  

LOCAL_MODULE    := hello-jni  

LOCAL_SRC_FILES := hello-jni.c  

LOCAL_C_INCLUDES:=include

LOCAL_CFLAGS:=-g

LOCAL_LDLAGS:=-pthread

LOCAL_LDLIBS:=-pthread

LOCAL_SYSTEM_SHARED_LIBRARYS:=libc libcutils

LOCAL_PRELINK_MODULE:=false

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

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

LOCAL_CFLAGS 指定编译选项

LOCAL_LDLAGS 指定链接选项

LOCAL_LDLIBS 指定链接选项,与LOCAL_LDLAGS类似

LOCAL_SYSTEM_SHARED_LIBRARYS  指定依赖的库,名字以模块名的方式指定,这里包含依赖关系,会导致被依赖的模块也会被编译。

LOCAL_PRELINK_MODULE   指定预链接的模块

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


增加静态库:

最后一句改成

include $(BUILD_STATIC_LIBRARY)     是用来指示将当前模块编译为静态库的,前缀为.a,后缀为.a。


增加应用:

最后一句改成

include $(BUILD_EXECUTABLE)   去掉LOCAL_PRELINK_MODULE


增加资源:




以上三者的生成结果分别在如下,generic依具体target会变:
out/target/product/generic/obj/EXECUTABLE
out/target/product/generic/obj/STATIC_LIBRARY
out/target/product/generic/obj/SHARED_LIBRARY
每个模块的目标文件夹分别为:
可执行程序:XXX_intermediates
静态库:      XXX_static_intermediates
动态库:      XXX_shared_intermediates

另外,在Android.mk文件中,还可以指定最后的目标安装路径,用LOCAL_MODULE_PATH和LOCAL_UNSTRIPPED_PATH来指定。不同的文件系统路径用以下的宏进行选择:
TARGET_ROOT_OUT:表示根文件系统。
TARGET_OUT:表示system文件系统。
TARGET_OUT_DATA:表示data文件系统。
用法如:
 CAL_MODULE_PATH:=$(TARGET_ROOT_OUT)


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)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值