Android.mk的用法

前言

Android.mk 文件是 Android 编译系统中用于描述项目源文件、库和模块的 Makefile。它采用 GNU Make 的语法,但也包含了一些特定于 Android 编译系统的规则和变量。以下是对其语法和使用方法的详细解释及示例。

一:模块种类

一个Android.mk file用来向编译系统描述你的源代码。具体来说:该文件是GNU Makefile的一小部分,会被编译系统解析一次或多次。你可以在每一个Android.mk file中定义一个或多个模块(具体类型取决于模块的功能和构建输出)。按类型主要有以下种类:

  • 共享库 (Shared Libraries)

    • 模块输出一个共享库(动态链接库),可以被其他模块在运行时动态加载。
    • 使用 include $(BUILD_SHARED_LIBRARY) 包含构建规则。
  • 静态库 (Static Libraries)

    • 模块输出一个静态库,编译时将其链接到其他模块。
    • 使用 include $(BUILD_STATIC_LIBRARY) 包含构建规则。
  • 可执行文件 (Executables)

    • 模块输出一个可执行文件。
    • 使用 include $(BUILD_EXECUTABLE) 包含构建规则。
  • 预编译库 (Prebuilt Libraries)

    • 模块使用预编译的库,而不是源代码编译的库。
    • 预编译共享库使用 include $(PREBUILT_SHARED_LIBRARY)
    • 预编译静态库使用 include $(PREBUILT_STATIC_LIBRARY)
  • Java 库 (Java Libraries)

    • 模块输出一个 Java 库(.jar 文件)。
    • 使用 include $(BUILD_STATIC_JAVA_LIBRARY)include $(BUILD_SHARED_JAVA_LIBRARY)
  • Android 应用 (Android Applications)

    • 模块输出一个 Android 应用(.apk 文件)。
    • 使用 include $(BUILD_PACKAGE)
  • 多媒体插件 (Multimedia Plugins)

    • 模块输出一个多媒体插件,通常用于媒体框架中。
    • 使用 include $(BUILD_PLUGIN)
  • 静态预编译头文件 (Static Prebuilt Headers)

    • 模块使用预编译的头文件。
    • 使用 include $(BUILD_PREBUILT)
  • 测试模块 (Test Modules)

    • 模块输出用于测试的可执行文件或库。
    • 例如 Google Test 使用 include $(BUILD_NATIVE_TEST)

二:各模块示例

共享库

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := my_shared_lib
LOCAL_SRC_FILES := my_shared_lib.cpp
include $(BUILD_SHARED_LIBRARY)

静态库

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := my_static_lib
LOCAL_SRC_FILES := my_static_lib.cpp
include $(BUILD_STATIC_LIBRARY)

可执行文件

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := my_executable
LOCAL_SRC_FILES := main.cpp
include $(BUILD_EXECUTABLE)

预编译共享文件 

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := prebuilt_shared_lib
LOCAL_SRC_FILES := $(LOCAL_PATH)/libs/$(TARGET_ARCH_ABI)/libprebuilt.so
include $(PREBUILT_SHARED_LIBRARY)

java静态库

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := my_java_lib
LOCAL_SRC_FILES := $(call all-java-files-under, src)
include $(BUILD_STATIC_JAVA_LIBRARY)

Android应用

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := my_app
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
include $(BUILD_PACKAGE)

 多媒体插件

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := my_plugin
LOCAL_SRC_FILES := plugin.cpp
include $(BUILD_PLUGIN)

静态预编译头文件

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := prebuilt_header
LOCAL_SRC_FILES := $(LOCAL_PATH)/include/prebuilt_header.h
include $(BUILD_PREBUILT)

Google Test模块

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := my_test
LOCAL_SRC_FILES := test.cpp
LOCAL_STATIC_LIBRARIES := gtest
include $(BUILD_NATIVE_TEST)

通过这些示例,可以看到 Android.mk 文件可以配置各种类型的模块,每种类型都有其特定的构建规则和变量配置。根据项目需求选择合适的模块类型,配置相应的构建规则,可以有效地管理和构建 Android 项目。

下面是一个综合示例(包含一些不常用的语法):

# 获取当前目录
LOCAL_PATH := $(call my-dir)  # 获取当前 Android.mk 文件所在的路径

# ========== 模块 1: 共享库 ==========
include $(CLEAR_VARS)  # 清除以前定义的所有 LOCAL_ 变量
LOCAL_MODULE := mysharedlibrary  # 定义共享库模块名称为 mysharedlibrary
LOCAL_SRC_FILES := main.cpp util.cpp  # 指定共享库的源文件列表
LOCAL_C_INC

相关推荐

  1. nc

    2024-06-17 07:08:04       35 阅读
  2. QueryWrapper

    2024-06-17 07:08:04       15 阅读
  3. axios

    2024-06-17 07:08:04       12 阅读
  4. React <> </>

    2024-06-17 07:08:04       10 阅读
  5. pymysql基本

    2024-06-17 07:08:04       41 阅读
  6. css_auto

    2024-06-17 07:08:04       38 阅读
  7. 关于QUOTENAME

    2024-06-17 07:08:04       42 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-17 07:08:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-17 07:08:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-17 07:08:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-17 07:08:04       20 阅读

热门阅读

  1. 2024.6.15 英语六级 经验与复盘

    2024-06-17 07:08:04       8 阅读
  2. 速盾:网站如何加上cdn?

    2024-06-17 07:08:04       6 阅读
  3. 22.2 正则表达式-数据验证、数据变换

    2024-06-17 07:08:04       6 阅读
  4. golang实现循环队列

    2024-06-17 07:08:04       8 阅读
  5. github基础使用

    2024-06-17 07:08:04       6 阅读
  6. QSharedMemory使用详解

    2024-06-17 07:08:04       7 阅读
  7. Qt 实战(4)信号与槽 | 4.3、信号连接信号

    2024-06-17 07:08:04       6 阅读
  8. 跨域资源共享(CORS)问题与解决方案

    2024-06-17 07:08:04       7 阅读
  9. wxml与标准的html的异同?

    2024-06-17 07:08:04       6 阅读
  10. 3.1. 马氏链-马氏链的定义和示例

    2024-06-17 07:08:04       6 阅读
  11. Android基础-JNI

    2024-06-17 07:08:04       6 阅读
  12. 一个简单的UDP客户端和服务端的完整C++示例

    2024-06-17 07:08:04       7 阅读