Android 中增加本地程序或者库, 这些程序与其所在路径没有关系, 只和它们的 Android.mk 有关系.
Android.mk 与普通的 makefile 略有不同, Android.mk 具有统一的写法, 主要包含一些系统的公共的宏:
Android.mk 中选项参考以下文件路径:
- build/core/config.mk
各个选项的默认值在以下文件中定义:
- build/core/base_config.mk
在一个 android.mk 中也可以生成多个可执行程序, 动态库, 静态库.
1. 编译程序:
1.1 可执行程序模板:
- LOCAL_PATH := $(call my-dir)
- include $(CLEAR_PATH)
- LOCAL_SRC_FILES := \
- main.c
- LOCAL_MODULE := test_exe
- #LOCAL_C_INCLUDES :=
- #LOCAL_STATIC_LIBRARIES :=
- #LOCAL_SHARED_LIBRARISE :=
- include $(BUILD_STATIC_LIBRAR)
- LOCAL_PATH:= $(call my-dir)
此行代码在 Android.mk 的开头, 用于给出当前文件的路径:
LOCAL_PATH:
用于在开发树中查找源文件;
宏函数'my-dir':
由编译系统提供, 用于返回当前路径 (即包含 Android.mk file 文件的目录)
- ---
- LOCAL_C_INCLUDES:
表示要加入所需要的包含头文件的路径
- ---
- LOCAL_MODULE:
表示模块最后最终名称
- ---
- LOCAL_STATIC_LIBRARIES:
加入所需要的连接的静态库
- ---
- LOCAL_SHARED_LIBRARISE:
加入所需要的动态库
最后使用 include $(BUILD_EXECUTABLE) 表示以一个可执行程序的方式进行编译; 最终生成的静态库为 libtest_static.a;
1.2 编译一个静态库
在 Android.mk 中编译一个静态库的模板如下所示:
- LOCAL_PATH := $(call my-dir)
- include $(CLEAR_PATH)
- LOCAL_SRC_FILES := \
- main.c
- LOCAL_MODULE := libtest_static
- #LOCAL_C_INCLUDES :=
- #LOCAL_STATIC_LIBRARIES :=
- #LOCAL_SHARED_LIBRARISE :=
- include $(BUILD_STATIC_LIBRARY)
1.3 编译一个动态库
在 Android.mk 中编译一个动态库的模板如下所示:
- LOCAL_PATH := $(call my-dir)
- include $(CLEAR_PATH)
- LOCAL_SRC_FILES := \
- helloworld.c
- LOCAL_MODULE := libtest_shared
- TARGET_PRELINK_MODULE := false
- #LOCAL_C_INCLUDES :=
- #LOCAL_STATIC_LIBRARIES :=
- #LOCAL_SHARED_LIBRARISE :=
- include $(BUILD_SHARED_LIBRARY)
同样, 最终生成的动态库的名称是 libtest_shared.so;
1.4 编译结果
可执行程序, 静态库, 动态库生成的编译结果分别为以下目录:
- out/target/product/xxxx/obj/EXECUTABLE
- out/target/product/xxxx/obj/STATIC_LIBRARY
- out/target/product/xxxx/obj/SHARED_LIBRARY
每一个模块的目标文件夹分别为:
可执行文件:{XXX}_intermediates
静态库: {XXX}_static_intermediates
动态库:{XXX}_shared__intermediates
在编译过程中, 可以编译目标机的内容, 也可以编译主机的内容, 可执行文件, 动态库, 静态库使用宏分别如下所示 :
- include $(BUILD_EXECUTABLE)
- include $(BUILD_STATIC_LIBRARY)
- include $(BUILD_SHARED_LIBRARY)
编译主机的内容, 可执行文件, 动态库, 静态库使用宏分别如下所示 :
- include $(BUILD_HOST_EXECUTABLE)
- include $(BUILD_HOST_STATIC_LIBRARY)
- include $(BUILD_HOST_SHARED_LIBRARY)
在 android.mk 中, 可以指定最后目标安装路径, 使用以下两个宏来指定:
- LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT)
- LOCAL_UNSTRIPPED_PATH := $(TARGET_ROOT_OUT_UNSTRIPPED)
不同文件系统使用以下宏来进行选择:
TARGET_ROOT_OUT: 根文件系统, 路径为: out{$43
- }product/xxxx/root
TARGET_OUT: 表示 system 文件系统, 路径为: out{$45
- }product/xxxx/system
TARGET_OUT_DATA: 表示 data 文件系统, 路径为: out/target/product/xxxx/data data:表示data文件系统,路径为:out{$49
- }product/xxxx/data
2. 安装程序:
除了编译各种内容外, 有时还需要向目标文件系统复制一些文件, 例如配置脚本, 资源文件, 预置的程序和库等, 也有时需要在目标文件系统中创建目录;
在 Android.mk, 进行目录创建和安装的实例如下:
- LOCAL_PATH := $(call my-dir)
- include $(CLEAR_PATH)
- xxx(这里使用正常 makefile 语法来编写 copy 动作或者创建动作)
详情看:
一个通用的 makefile(一)
一个通用的 Makefile(二)
来源: https://www.cnblogs.com/linhaostudy/p/8934735.html