Android.mk初始和应用

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提供的日志输出功能,方案如下:

  1. 在cpp源文件中通过#include<android/log.h>导入头文件,并在具体函数中调用ALOGX等函数;
  2. 在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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值