• Android NDK入坑之旅(三):NDK项目的构建之.mk文件


    NDK 的核心目的之一是让您将 C 和 C++ 源代码构建为可用于应用的共享库。

    1.Android.mk简介

    1).Android.mk 在NDK项目中的位置:

    Android.mk 文件位于项目 jni/ 目录的子目录中,如下图:


    2).Android.mk文件的作用:

    用于向构建系统描述源文件和共享库:

    • 定义 Application.mk;
    • 构建系统和环境变量所未定义的项目范围设置;
    • 替换特定模块的项目范围设置。

    2.Android.mk基础知识:

    • Android.mk 文件必须首先定义 LOCAL_PATH 变量:
      # 源文件在开发树中的位置
      # 在这里,构建系统提供的宏函数 my-dir 将返回当前目录(包含 Android.mk 文件本身的目录)的路径
      LOCAL_PATH := $(call my-dir)
    • 接着声明 CLEAR_VARS 变量:
      # CLEAR_VARS 变量指向特殊 GNU Makefile,可为您清除许多 LOCAL_XXX 变量
      # 注意,它不会清除 LOCAL_PATH,此变量必须保留其值,因为系统在单一 GNU Make 执行环境(其中所有变量都是全局的)中解析所有构建控制文件。 在描述每个模块之前,必须声明(重新声明)此变量
      include $(CLEAR_VARS)
    • LOCAL_MODULE 变量将存储您要构建的模块的名称:
      # XXX代表你想要生成的动态库文件的名字
      # 在生成过程中系统会自动在xxx前面加上lib,形成libXXX.so的形式
      # 应用的每个模块都应该使用一个该变量
      LOCAL_MODULE := XXX
    • 枚举源文件,以空格分隔多个文件:
      # 变量必须包含要构建到模块中的 C 和/或 C++ 源文件列表
      LOCAL_SRC_FILES := hello-jni.c
    • 连接系统所有内容:
      # BUILD_SHARED_LIBRARY 变量指向GNU Makefile脚本,用于收集您自最近 include 后在 LOCAL_XXX 变量中定义的所有信息
      # GNU Makefile脚本确定要构建的内容及其操作方法
      include $(BUILD_SHARED_LIBRARY)
    • 可以定义自己的任意变量,定义变量时请注意,NDK 构建系统会预留以下变量名称:
    • 以 LOCAL_ 开头的名称,例如 LOCAL_MODULE;
    • 以 PRIVATE_、NDK_ 或 APP 开头的名称。构建系统在内部使用这些变量;
    • 小写名称,例如 my-dir,构建系统也是在内部使用这些变量;
    • 如果为了方便而需要在 Android.mk 文件中定义自己的变量,建议在名称前附加 MY_;
    • NDK定义的变量及函数宏详解。
    • 一个简单的Android.mk文件:
      LOCAL_PATH := $(call my-dir)
      
      include $(CLEAR_VARS)
      
      LOCAL_MODULE    := XXX
      LOCAL_SRC_FILES := Java_xxx_..._XXX.c
      
      include $(BUILD_SHARED_LIBRARY)

     3.Application.mk简介

    此文件用于描述应用需要的原生模块;
    模块可以是静态库、共享库或可执行文件。

    关于该文件,这里着重介绍一下APP_ABI变量,其它变量详情请移步至Application.mk

    • 默认情况下,NDK 构建系统为 armeabi ABI 生成机器代码;
    • 此机器代码对应于基于 ARMv5TE、采用软件浮点运算的 CPU;
    • 使用该变量可以选择不同的ABI
    • APP_ABI 不同指令集的设置见下表:
    • all 从 NDKr7 开始可用。
      指令集
      基于 ARMv7 的设备上的硬件 FPU 指令 APP_ABI := armeabi-v7a
      ARMv8 AArch64 APP_ABI := arm64-v8a
      IA-32 APP_ABI := x86
      Intel64 APP_ABI := x86_64
      MIPS32 APP_ABI := mips
      MIPS64 (r6) APP_ABI := mips64
      所有支持的指令集 APP_ABI := all
    但行好事,莫问前程;你若盛开,蝴蝶自来;你若坚强,命运自会给你打赏。
  • 相关阅读:
    C++中的类模板详细讲述
    函数模板和模板函数
    vs2008 快捷键大全
    #宏定义##
    多工程项目设置
    conemu 配置
    itcast-svn
    itcast-spring-三大框架整合
    Spring通知方法错误
    动态代理
  • 原文地址:https://www.cnblogs.com/songjie-xuan/p/7416927.html
Copyright © 2020-2023  润新知