• Android.mk 详解


    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/target/product/xxxx/root
    • TARGET_OUT:表示system文件系统,路径为:out/target/product/xxxx/system
    • TARGET_OUT_DATA:表示data文件系统,路径为:out/target/product/xxxx/data

    2.安装程序:

    除了编译各种内容外,有时还需要向目标文件系统复制一些文件,例如配置脚本、资源文件、预置的程序和库等,也有时需要在目标文件系统中创建目录;
    在Android.mk,进行目录创建和安装的实例如下:

    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_PATH)
    xxx(这里使用正常makefile语法来编写copy动作或者创建动作)
    

    详情看:
    一个通用的makefile(一)
    一个通用的Makefile(二)

  • 相关阅读:
    谁知道怎么获得客户端的语系,不是encoding哦
    如何动态控制弹出窗体的大小
    维权成功!
    KFC的mm在练习做圣代
    CICD自动化发版系统设计简介
    java IO (File类)
    StringBuffer
    Arrays和比较器
    java正则
    Math和Random类
  • 原文地址:https://www.cnblogs.com/linhaostudy/p/8934735.html
Copyright © 2020-2023  润新知