Android mk文件解析

  • Android.mk结构
// c/c++源文件目录
LOCAL_PATH:=$(call my-dir)

// 清除环境变量,必须放在LOCAL_PAHT之后,否则无法编译成功
include $(CLEAR_VARS)

// 编译生成的module名称
LOCAL_MODULE:=test

// 需要编译的源文件
LOCAL_SRC_FILES:=main.c

// 编译生成的可执行文件存放的目录
LOCAL_MODULE_PATH:=$(LOCAL_PATH)/bin

// 编译生成的目标文件格式,这里指定编译完成后生成二进制文件
include $(BUILD_EXECUTABLE)
  • Android.mk编译多个文件
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:=test
// 使用符号'\'连接多个需要编译的源文件
LOCAL_SRC_FILES:= main.c \
					main1.c 
LOCAL_MODULE_PATH:=$(LOCAL_PATH)/bin
include $(BUILD_EXECUTABLE)

这种编译方式的缺点是,如果新增或删减某个文件,都需要修改Android.mk文件,比较麻烦

  • Android.mk指定编译源文件的目录
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:=test
// all-c-files-under是系统提供的函数,指定要编译的源文件目录
LOCAL_C_ALL_FILES:=$(call all-c-files-under)
// 指定编译的源文件是该目录下的所有c源文件
LOCAL_SRC_FILES:=$(LOCAL_C_ALL_FILES)
LOCAL_MODULE_PATH:=$(LOCAL_PATH)/bin
include $(BUILD_EXECUTABLE)
  • Android.mk生成动态库文件
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
	LOCAL_MODULE:=test
LOCAL_SRC_FILES:=main.c
LOCAL_MODULE_PATH:=$(LOCAL_PATH)/bin
// 指定编译生成动态库.so文件
include $(BUILD_SHARED_LIBRARY)
  • Android.mk生成静态库文件
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:=test
LOCAL_SRC_FILES:=main.c
LOCAL_MODULE_PATH:=$(LOCAL_PATH)/bin
// 指定生成静态库.a文件
include $(BUILD_STATIC_LIBRARY)
  • Android.mk生成多个编译目录
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:=test1
LOCAL_C_ALL_FILES:=$(call all-c-files-under)
LOCAL_SRC_FILES:=$(LOCAL_C_ALL_FILES)
LOCAL_MODULE_PATH:=$(LOCAL_PATH)/bin
include $(BUILD_EXECUTABLE)

// 不需要再指定LOCAL_PATH,因为当前源文件路径相同
include $(CLEAR_VARS)
LOCAL_MODULE:=test2
LOCAL_C_ALL_FILES:=$(call all-c-files-under)
LOCAL_SRC_FILES:=$(LOCAL_C_ALL_FILES)
LOCAL_MODULE_PATH:=$(LOCAL_PATH)/bin
include $(BUILD_EXECUTABLE)
  • Android.mk引入库

test.c

void call_test() {
	return;
}

test.h

#ifndef TEST_H
#define TEST_H
extern void call_test(void)
#endif

main.c

#include <stdio.h>
#include <utils/Log.h>
#include <test.h> 
// extern void cal_test(void);	// 引用test.c的函数

int main() {
	call_test();
	ALOGE("hello Android");
	return 0;
}

Android.mk

// test.c源文件的Android.mk,和main.c的Android.mk写在同一个mk下
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:=libtest
LOCAL_SRC_FILES:=test.c
LOCAL_MODULE_PATH:=$(LOCAL_PATH)/bin
include $(BUILD_EXECUTABLE)

// main.c源文件的Android.mk
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:=test
LOCAL_SRC_FILES:=main.c

// 引入第三方函数库extern void call_test(void)
// "-L./lib/"路径为LOCAL_PATH/lib,因为test.c的LOCAL_MODULE_PATH指定为LOCAL_PATH/lib
// "-ltest"链接到LOCAL_MODUL为test
LOCAL_LDFLAGS:=-L./lib/ -ltest

// 引入静态库,要提供绝对路径 
LOCAL_LDFLAGS:=$(LOAL_PATH)/lib/libtest

// 引入系统库#include<utils/Log.h>
LOCAL_SHARED_LIBRARIES += liblog

// 引入第三方头文件库,例子中引入#include<test.h>
LOCAL_C_INCLUDES:=$(LOCAL_PATH)/inc

LOCAL_MODULE_PATH:=$(LOCAL_PATH)/bin
include $(BUILD_EXECUTABLE)
  • Android.mk生成apk
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:=test
// 调用函数all-subdir_java_files函数,获取所有需要编译的java文件
LOCAL_SRC_FILES:=$(call all-subdir-java-files)
// 编译生成的apk名称
LOCAL_PACKAGE_NAME:=packagename
// 编译生成apk
include $(BUILD_PACKAGE)
  • Android.mk生成jar包
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:=$(call all-subdir-java-files)
LOCAL-MODULE:=com.test.myjar
// 编译成静态jar包
include $(BUILD_STATIC_JAVA_LIBRARY)
// 编译成共享jar包
include $(BUILD_JAVA_LIBRARY)

静态jar包:

include $(BUILD_STATIC_JAVA_LIBRARY)使用.class文件打包而成的jar文件,可以在任何java虚拟机运行

动态jar包:

include $(BUILD_JAVA_LIBRARY)在静态jar包基础上使用.dex打包而成的jar文件,.dex是android系统使用的文件格式
  • apk引入依赖的jar包
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
// 引入apk依赖的静态jar包
LOCAL_STATIC_JAVA_LIBRARIES:=static-library
// 引入apk依赖的动态jar包
LOCAL_JAVA_LIBRARIES:=share-library	
LOCAL_SRC_FILES:=$(call all-subdir-java-fiiles)
LOCAL_PACKAGE_NAME:=packagename
include $(BUILD_PACKAGE)
  • 预编译jar包
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
// 指定编译生成文件类型
LOCAL_MODULE_CLASS:=JAVA_LIBRARIES
LOCAL_MODULE:=com.test.share
LOCAL_SRC_FILES:=com.test.static
// 预编译
include $(BUILD_PREBUILT)

预编译支持生成的文件类型:

LOCAL_MODULE_CLASS:编译文件类型
JAVA_LIBRARIES:dex归档文件
APPS:apk文件
SHARED_LIBRARIES:动态库文件
EXECUTABLES:二进制文件
ETC:其他文件格式
  • Android.mk添加判断语句
// 如果指定的VALUE和x相同,则执行do_yes,否则do_no
ifeq($(VALUE), x) #ifneq
	do_yes
else 
	do_no
endif

ifeq/ifneq:根据判断条件执行相关编译
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值