zoukankan      html  css  js  c++  java
  • Android.mk的用法和基础【转】

    一个Android.mk file用来向编译系统描述你的源代码。具体来说:该文件是GNU Makefile的一小部分,会被编译系统解析一次或多次。你可以在每一个Android.mk file中定义一个或多个模块,你也可以在几个模块中使用同一个源代码文件。编译系统为你处理许多细节问题。例如,你不需要在你的Android.mk中列出头文件和依赖文件。NDK编译系统将会为你自动处理这些问题。这也意味着,在升级NDK后,你应该得到新的toolchain/platform支持,而且不需要改变你的Android.mk文件。 
          先看一个简单的例子:一个简单的"hello world",比如下面的文件: 
    sources/helloworld/helloworld.c 
    sources/helloworld/Android.mk 
    相应的Android.mk文件会象下面这样: 
    ---------- cut here ------------------ 
    LOCAL_PATH := $(call my-dir) 
    include $(CLEAR_VARS) 
    LOCAL_MODULE 
    := helloworld 
    LOCAL_SRC_FILES := helloworld.c 
    include $(BUILD_SHARED_LIBRARY) 
    ---------- cut here ------------------ 
          我们来解释一下这几行代码: 
    LOCAL_PATH := $(call my-dir) 
    一个Android.mk file首先必须定义好LOCAL_PATH变量。它用于在开发树中查找源文件。在这个例子中,宏函数’my-dir’, 由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)。 
    include $( CLEAR_VARS) 
    CLEAR_VARS由编译系统提供,指定让GNU MAKEFILE为你清除许多LOCAL_XXX变量(例如 LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, 等等...),除LOCAL_PATH 。这是必要的,因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的。 
    LOCAL_MODULE := helloworld 
    LOCAL_MODULE变量必须定义,以标识你在Android.mk文件中描述的每个模块。名称必须是唯一的,而且不包含任何空格。注意编译系统会自动产生合适的前缀和后缀,换句话说,一个被命名为'foo'的共享库模块,将会生成'libfoo.so'文件。 
    LOCAL_SRC_FILES := helloworld.c 
    LOCAL_SRC_FILES变量必须包含将要编译打包进模块中的C或C++源代码文件。注意,你不用在这里列出头文件和包含文件,因为编译系统将会自动为你找出依赖型的文件;仅仅列出直接传递给编译器的源代码文件就好。

          在Android中增加本地程序或者库,这些程序和库与其所载路径没有任何关系,只和它们的Android.mk文件有关系。Android.mk和普通的Makefile有所不同,它具有统一的写法,主要包含一些系统公共的宏。 
         在一个Android.mk中可以生成多个可执行程序、动态库和静态库。 
    1,编译应用程序的模板: 
         #Test Exe 
         LOCAL_PATH := $(call my-dir) 
         #include $(CLEAR_VARS) 
         LOCAL_SRC_FILES:= main.c 
         LOCAL_MODULE:= test_exe 
         #LOCAL_C_INCLUDES := 
         #LOCAL_STATIC_LIBRARIES := 
         #LOCAL_SHARED_LIBRARIES := 
         include $(BUILD_EXECUTABLE) 
    (菜鸟级别解释::=是赋值的意思,$是引用某变量的值)LOCAL_SRC_FILES中加入源文件路径,LOCAL_C_INCLUDES 中加入所需要包含的头文件路径,LOCAL_STATIC_LIBRARIES加入所需要链接的静态库(*.a)的名称,LOCAL_SHARED_LIBRARIES中加入所需要链接的动态库(*.so)的名称,LOCAL_MODULE表示模块最终的名称,BUILD_EXECUTABLE表示以一个可执行程序的方式进行编译。 
    2,编译静态库的模板: 
         #Test Static Lib 
         LOCAL_PATH := $(call my-dir) 
         include $(CLEAR_VARS) 
         LOCAL_SRC_FILES:=  
                   helloworld.c 
         LOCAL_MODULE:= libtest_static 
         #LOCAL_C_INCLUDES := 
         #LOCAL_STATIC_LIBRARIES := 
         #LOCAL_SHARED_LIBRARIES := 
         include $(BUILD_STATIC_LIBRARY) 
    一般的和上面相似,BUILD_STATIC_LIBRARY表示编译一个静态库。 
    3,编译动态库的模板: 
         #Test Shared Lib 
         LOCAL_PATH := $(call my-dir) 
         include $(CLEAR_VARS) 
         LOCAL_SRC_FILES:=  
                   helloworld.c 
         LOCAL_MODULE:= libtest_shared 
         TARGET_PRELINK_MODULES := false 
         #LOCAL_C_INCLUDES := 
         #LOCAL_STATIC_LIBRARIES := 
         #LOCAL_SHARED_LIBRARIES := 
          include $(BUILD_SHARED_LIBRARY) 
    一般的和上面相似,BUILD_SHARED_LIBRARY表示编译一个静态库。 
          以上三者的生成结果分别在如下,generic依具体target会变: 
    out/target/product/generic/obj/EXECUTABLE 
    out/target/product/generic/obj/STATIC_LIBRARY 
    out/target/product/generic/obj/SHARED_LIBRARY 
          每个模块的目标文件夹分别为: 
    可执行程序:XXX_intermediates 
    静态库:      XXX_static_intermediates 
    动态库:      XXX_shared_intermediates 
          另外,在Android.mk文件中,还可以指定最后的目标安装路径,用LOCAL_MODULE_PATH和LOCAL_UNSTRIPPED_PATH来指定。不同的文件系统路径用以下的宏进行选择: 
    TARGET_ROOT_OUT:表示根文件系统。 
    TARGET_OUT:表示system文件系统。 
    TARGET_OUT_DATA:表示data文件系统。 
    用法如: 
    CAL_MODULE_PATH:=$(TARGET_ROOT_OUT)

    出处 Android.mk的用法和基础 - zhandoushi的专栏 - CSDN博客

  • 相关阅读:
    关于Maya Viewport 2.0 API 开发的介绍视频
    春节大假
    Some tips about the life cycle of Maya thread pool
    Can I compile and run Dx11Shader for Maya 2015 on my side?
    How to get current deformed vertex positions in MoBu?
    想加入全球首届的 欧特克云加速计划吗?
    三本毕业(非科班),四次阿里巴巴面试,终拿 offer(大厂面经)
    mac、window版编辑器 webstorm 2016... 永久破解方法。
    node 搭载本地代理,处理web本地开发跨域问题
    js 一维数组,转成嵌套数组
  • 原文地址:https://www.cnblogs.com/xiaonanxia/p/5126453.html
Copyright © 2011-2022 走看看