- 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:根据判断条件执行相关编译