1 Android.mk初识
1.1 文件夹Lesson1目录结构和内容
Lesson1
├── Android.mk
├── main.c
└── nativeLib.c
/*-----------------------main.c-----------------------*/
#include <stdio.h>
extern void nativeProcess1();
int main(void) {
printf("Hello Android.mk\n");
nativeProcess1();
return 0;
}
/*-----------------------nativeLib.c-----------------------*/
#include <stdio.h>
void nativeProcess1() {
printf("nativeProcess1\n");
}
/*-----------------------Android.mk-----------------------*/
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := moduleOne
LOCAL_SRC_FILES := nativeLib.c \
main.c
#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)
1.2 Android.mk语句分析
LOCAL_X这些变量都是内置的变量,my-dir/CLEAR_VARS/all-c-files-under/BUILD_EXECUTABLE代表特定的MK脚本
- my-dir: build/core/definitions.mk中定义,从定义看返回Android.mk文件所在目录
/*-----------------------build/core/definitions.mk-----------------------*/
# Figure out where we are.
define my-dir
$(strip \
$(eval LOCAL_MODULE_MAKEFILE := $$(lastword $$(MAKEFILE_LIST))) \
$(if $(filter $(BUILD_SYSTEM)/% $(OUT_DIR)/%,$(LOCAL_MODULE_MAKEFILE)), \
$(error my-dir must be called before including any other makefile.) \
, \
$(patsubst %/,%,$(dir $(LOCAL_MODULE_MAKEFILE))) \
) \
)
endef
- CLEAR_VARS: build/core/config.mk中定义,查看代表的脚本只是对内部除LOCAL_PATH外的变量进行清零赋值
/*-----------------------build/core/config.mk-----------------------*/
CLEAR_VARS :=$= $(BUILD_SYSTEM)/clear_vars.mk
# BUILD_SYSTEM定义在build/core/config.mk,有些AOSP定义在build/core/main.mk
# BUILD_SYSTEM :=$= build/make/core
## BUILD_X也定义在build/core/config.mk
BUILD_SHARED_LIBRARY :=$= $(BUILD_SYSTEM)/shared_library.mk
BUILD_STATIC_LIBRARY :=$= $(BUILD_SYSTEM)/static_library.mk
BUILD_PREBUILT :=$= $(BUILD_SYSTEM)/prebuilt.mk
BUILD_MULTI_PREBUILT :=$= $(BUILD_SYSTEM)/multi_prebuilt.mk
BUILD_JAVA_LIBRARY :=$= $(BUILD_SYSTEM)/java_library.mk
BUILD_STATIC_JAVA_LIBRARY :=$= $(BUILD_SYSTEM)/static_java_library.mk
BUILD_EXECUTABLE :=$= $(BUILD_SYSTEM)/executable.mk
BUILD_PACKAGE :=$= $(BUILD_SYSTEM)/package.mk
2 Android.mk进阶
学习如何引用NDK系统库,引入第三方动态库和静态库
2.1 由LOCAL_SHARED_LIBRARIES或LOCAL_LDLIBS引入系统库
引用系统liblog.so提供的日志输出功能,方案如下:
- 在cpp源文件中通过#include<android/log.h>导入头文件,并在具体函数中调用ALOGX等函数;
- 在Android.mk中给LOCAL_SHARED_LIBRARIES变量新增liblog库名
/*-----------------------main.cpp-----------------------*/
#include <stdio.h>
#define LOG_TAG "MAIN"
#include <android/log.h> // 提供ALOGD函数头文件
int main(void) {
ALOGD("Hello, Android.mk from ALOGD"); // liblog.so提供的打印函数
return 0;
}
/*----------------------- Android.mk-----------------------*/
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := moduleTwo
LOCAL_SRC_FILES := src/main.cpp
#LOCAL_C_ALL_FILES := $(call all-c-files-under)
#LOCAL_SRC_FILES := $(LOCAL_C_ALL_FILES)
#LOCAL_MODULE_PATH := $(LOCAL_PATH)/bin
#添加系统库依赖
LOCAL_LDLIBS := -llog
#LOCAL_SHARED_LIBRARIES += liblog
include $(BUILD_EXECUTABLE)
2.2 由LOCAL_LDFLAGS引入第三方库
LOCAL_LDFLAGS := -LLibPath -lLibName – 引入动态库
LOCAL_LDFLAGS := LibPath/LibName.a — 引入静态库
2.2.1 文件夹Lesson3目录结构和内容
Lesson3
├── Android.mk
└── src
├── main.cpp
└── nativeLib
├── include
│ └── nativeLib.h
└── nativeLib.cpp
/*----------------------- nativeLib.h-----------------------*/
#ifndef MY_NATIVE_LIB_3
#define MY_NATIVE_LIB_3
#include<stdio.h>
extern void nativeProcess3(void);
#endif // MY_NATIVE_LIB_3
/*----------------------- nativeLib.cpp-----------------------*/
#include "./include/nativeLib.h"
void nativeProcess3(void) {
printf("nativeProcess3");
}
/*----------------------- main.cpp-----------------------*/
#include <nativeLib.h> // 需要借住LOCAL_C_INCLUDES
int main(void) {
nativeProcess3();
return 0;
}
/*----------------------- Android.mk-----------------------*/
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libmoduleThreeShare
MY_LIB_CPP_FILES := $(wildcard $(LOCAL_PATH)/**/**/*.cpp)
LOCAL_SRC_FILES := $(MY_LIB_CPP_FILES:$(LOCAL_PATH)/%=%)
#LOCAL_MODULE_PATH := $(LOCAL_PATH)/libs
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := libmoduleThreeStatic
MY_LIB_CPP_FILES := $(wildcard $(LOCAL_PATH)/**/**/*.cpp)
LOCAL_SRC_FILES := $(MY_LIB_CPP_FILES:$(LOCAL_PATH)/%=%)
#LOCAL_MODULE_PATH := $(LOCAL_PATH)/libs
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := moduleThree
LOCAL_SRC_FILES := src/main.cpp
# LOCAL_LDFLAGS需要相对路径
LOCAL_LDFLAGS := -L./libs/ -lmoduleThreeShare
# LOCAL_C_INCLUDES需要绝对路径
LOCAL_C_INCLUDES += $(LOCAL_PATH)/src/nativeLib/include
#LOCAL_MODULE_PATH := $(LOCAL_PATH)/bin
include $(BUILD_EXECUTABLE)
include $(CLEAR_VARS)
LOCAL_MODULE := moduleThree2
LOCAL_SRC_FILES := src/main.cpp
# LOCAL_LDFLAGS需要绝对路径
LOCAL_LDFLAGS := $(LOCAL_PATH)/libs/libmoduleThreeStatic.a
# LOCAL_C_INCLUDES需要绝对路径
LOCAL_C_INCLUDES += $(LOCAL_PATH)/src/nativeLib/include
#LOCAL_MODULE_PATH := $(LOCAL_PATH)/bin
include $(BUILD_EXECUTABLE)
3 Android.mk应用示例
下面这个例子演示了编译libAITx.so的mk文件,libAITx库依赖libAI和libyuv静态库,依赖系统的log(日志打印)、dl(动态库加载)、m(数学函数动态库)、z(压缩解压缩库))库,另外使用了OpenCV接口。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := AI_STATIC
LOCAL_SRC_FILES := $(LOCAL_PATH)/libs/AI/lib/$(TARGET_ARCH_ABI)/libAI.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/libs/AI/include
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := YUV_STATIC
LOCAL_SRC_FILES := $(LOCAL_PATH)/libs/libyuv/lib/$(TARGET_ARCH_ABI)/libyuv.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/libs/libyuv/include
include $(PREBUILT_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_CFLAGS := -mfpu=neon -mfloat-abi=softfp
OPENCV_CAMERA_MODULES:=off
OPENCV_INSTALL_MODULES:=on
OPENCV_LIB_TYPE := STATIC
include C:/SDK/OpenCV-4.1.0-android-sdk/sdk/native/jni/Opencv.mk
LOCAL_CFLAGS += -O3 -DANDROID
LOCAL_CPPFLAGS += -std=c++11 -O3 -DANDROID
LOCAL_MODULE := AITx
MY_CPP_LIST := $(wildcard $(LOCAL_PATH)/src/main/cpp/*.cpp)
MY_CPP_LIST += $(wildcard $(LOCAL_PATH)/src/main/cpp/util/*.cpp)
LOCAL_SRC_FILES := $(MY_CPP_LIST:$(LOCAL_PATH)/%=%)
#LOCAL_STATIC_LIBRARIES := AI_STATIC YUV_STATIC
LOCAL_WHOLE_STATIC_LIBRARIES := AI_STATIC YUV_STATIC
LOCAL_LDFLAGS += -O3
LOCAL_LDLIBS := -llog -ldl -lm -lz
#LOCAL_CPP_FEATURES := rtti exceptions
include $(BUILD_SHARED_LIBRARY)