借鉴并整理:http://blog.sina.com.cn/s/blog_602f8770010148ce.html

android-ndk-r10d/build/core/*.mk文件

结合自己的Android.mk文件记录
- Android.mk简介:
Android.mk文件用来告知NDK Build系统关于Source的信息。 Android.mk是GNU Makefile的一部分,且将被Build System解析一次或多次。所以,请尽量少的在Android.mk中声明变量,也不要假定任何东西不会在解析过程中定义。

Android.mk文件语法允许我们将Source打包成一个”modules”. modules可以是:
静态库
动态库。

只有动态库可以被 install/copy到应用程序包(APK). 静态库则可以被链接入动态库。
可以在一个Android.mk中定义一个或多个modules. 也可以将同一份source 加进多个modules.

Build System帮我们处理了很多细节而不需要我们再关心。例如:你不需要在Android.mk中列出头文件和外部依赖文件。NDK Build System自动帮我们提供这些信息。这也意味着,当用户升级NDK后,你将可以受益于新的toolchain/platform而不必再去修改Android.mk.

每一个NDK程序都是必备的Android.mk程序

  • Build System构建系统,是基于GNU Makefile的是由多种GNU Makefile片段构成,这些片段在ndk安装程序的build/core中
    标注*号的是在一个mk文件中必须定义的
    LOCAL_PATH := $(call my-dir) *
include $(CLEAR_VARS) *

LOCAL_MODULE_TAGS := optional *

LOCAL_STATIC_JAVA_LIBRARIES := gson jcifs

LOCAL_SRC_FILES := $(call all-java-files-under, src)
#LOCAL_SRC_FILES := $(call all-subdir-java-files)

#LOCAL_SDK_VERSION := current
LOCAL_CERTIFICATE := platform

LOCAL_PACKAGE_NAME := IServerService *

include $(BUILD_PACKAGE)

include $(CLEAR_VARS)

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := gson:libs/gson-2.7.jar jcifs:libs/jcifs-1.3.18.jar

include $(BUILD_MULTI_PREBUILT)

# Use the folloing include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH))
  • 关键词如下

    1. LOCAL_PATH := $(call my-dir)
      每个Android.mk文件必须以定义LOCAL_PATH为开始。它用于在开发tree中查找源文件。宏my-dir则由Build System提供。返回包含Android.mk的目录路径。

    2. include $(CLEAR_VARS) //build/core/clear-vars.mk
      CLEAR_VARS 变量由Build System提供。并指向一个指定的GNU Makefile,由它负责清理很多LOCAL_xxx.
      例如:LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES等等。但不清理LOCAL_PATH. 这个清理动作是必须的,因为所有的编译控制文件由同一个GNU Make解析和执行,其变量是全局的。所以清理后才能避免相互影响。

    3. LOCAL_MODULE_TAGS := optional/user/eng/tests 四个选项
      user 该模块只在user版本下才编译
      eng 该模块只在eng版本下编译
      tests 该模块只在tests版本下编译
      optional 在所有版本下都会编译

      LOCAL_MODULE := hello-jni
      LOCAL_MODULE模块必须定义,以表示Android.mk中的每一个生成输出模块的名字。名字必须唯一且不包含空格。Build System会自动添加适当的前缀和后缀。例如,foo,要产生动态库,则生成libfoo.so.
      但请注意:如果模块名被定为:libfoo.则生成libfoo.so. 不再加前缀。

      LOCAL_MODULE_FILENAME 重新定义当前模块名字

    4. LOCAL_STATIC_JAVA_LIBRARIES := gson jcifs javax.servlet.jsp_2 javax.servlet_3
      LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := gson:libs/gson-2.7.jar jcifs:libs/jcifs-1.3.18.jar

    5. LOCAL_SRC_FILES := hello-jni.c
      通过空格分开添加多个源文件名;
      LOCAL_PATH的相对路径
      LOCAL_SRC_FILES包含将要打包如模块的C/C++ 源码。不必列出头文件,build System 会自动帮我们找出依赖文件。
      缺省的C++源码的扩展名为.cpp. 也可以修改,通过LOCAL_CPP_EXTENSION。

    6. LOCAL_CPP_EXTENSION
      C++源文件的默扩展名.cpp.为c++程序指定一个或者多个扩展名

    7. LOCAL_CERTIFICATE := platform
      LOCAL_CERTIFICATE 后面是签名文件的文件名,说明IServerService.apk是一个需要platform key签名的APK

    8. LOCAL_PACKAGE_NAME := IServerService // == LOCAL_MODULE
      package的名字,这个名字在脚本中将标识app或package

    9. include $(BUILD_PACKAGE) //用来编译package/app下的apk文件 ,,与10一个性质

    10. include $(BUILD_SHARED_LIBRARY)

      引入模块构建共享库.
      BUILD_SHARED_LIBRARY:是Build System提供的一个变量,指向一个GNU Makefile Script。它负责收集自从上次调用 include $(CLEAR_VARS) 后的所有LOCAL_XXX信息。并决定编译成为什么类型的模块。

      BUILD_STATIC_LIBRARY:编译为静态库。//build-static-library.mk
      BUILD_SHARED_LIBRARY :编译为动态库//build-shared-library.mk
      BUILD_EXECUTABLE:编译为独立可执行程序//build-executable.mk

    11. include $(all-subdir-makefiles)
      包含当前目录下的所有子目录下的mk文件
      调用以上命令可以将所有的Android.mk文件包含在当前项目构建过程中;

    12. LOCAL_SRC_FILES := $(call all-subdir-c-files)

    13. include (callallmakefilesunder, (LOCAL_PATH))
      //build LOCAL_PATH 加载当前目录下的所有makefile文件

    14. LOCAL_SRC_FILES := $(call all-java-files-under, src) //all-java-files-under宏的定义是在build/core/definitions.mk中
      //src表示目录
      包含java源码,表示在src目录下的java源码,当然默认包含LOCAL_PATH下的所有java文件.

    15. LOCAL_SRC_FILES := $(call all-subdir-java-files)
      java子目录中的所有java文件

  • 多个共享库可以在同一个Android.mk中被定义
    如下格式

    LOCAL_PATH := $(call my-dir)

    //模块一

    include $(CLEAR_VARS)

    LOCAL_MODULE := modulel
    LOCAL_SRC_FILES := moduel.c
    include $(BUILD_SHARED_LIBRARY)

    //模块二

    include $(CLEAR_VARS)

    LOCAL_MODULE := modulel2
    LOCAL_SRC_FILES := moduel2.c
    include $(BUILD_SHARED_LIBRARY)

    处理完成Android.mk文件后会生成两个共享文件: libmodulel.so和libmodulel2.so

    • 构建静态库
      Android NDK支持静态库,但不直接使用静态库,需要其共享库调用,如第三方源代码编成静态库被调用.
      如下格式:
      LOCAL_PATH := $(call my-dir)

    //模块一 静态库 可以是单独一个模块亦可以是第三方库源码

    include $(CLEAR_VARS)

    LOCAL_MODULE := modulel3
    LOCAL_SRC_FILES := moduel3.c
    include $(BUILD_STATIC_LIBRARY)

    //模块二

    include $(CLEAR_VARS)

    LOCAL_MODULE := modulel4
    LOCAL_SRC_FILES := moduel4.c

    LOCAL_STATIC_LIBRARIES := modulel3 //使用静态库

    include $(BUILD_SHARED_LIBRARY)

    //模块三 使用模块一的静态库

    include $(CLEAR_VARS)

    LOCAL_MODULE := modulel5
    LOCAL_SRC_FILES := moduel5.c

    LOCAL_SHARED_LIBRARIES := modulel4 //使用共享库

    include $(BUILD_SHARED_LIBRARY)

更多相关文章

  1. Android Studio Gradle 缓存文件夹设置
  2. android设备中的临时文件夹在哪里?
  3. 使用Java解析XML文件以获取名称列表
  4. cocos2d-x避免手动修改android.mk文件来编译
  5. 尝试查看所有XML文件的图形布局时出现StackOverFlowError
  6. android使用存储在assets文件夹中的Linux工具
  7. 如何将音频文件与新视频文件合并?是否可以在Android中使用?
  8. 无法从Android中的Asset文件夹复制数据库
  9. android 中的 odex 文件

随机推荐

  1. 十大最主流的PHP框架
  2. 新手应该知道的php多图片上传的实现
  3. php构建一个区块链(含源码)
  4. PHP global 关键词的实例详解
  5. use在php中的使用方法(代码示例)
  6. PHP高级应用的讲解
  7. php的定界符<<<EOF的解析
  8. PHP Composer是什么技术?一起看看
  9. Mac搭建php的开发环境(图文详解)
  10. php获取mp3音频信息实例教程