NDK简介

简介

Native Development kit
原生开发工具包(NDK)是一组在 Android 应用中利用 C 和 C++ 代码的工具。因为 Java 无法直接调用 C 和 C++ 的代码,想要在 Android 应用中使用原生代码,NDK 便应运而生。
NDK 的核心目的之一是让 C 和 C++ 源代码构建为可用于应用的共享库。

工作方式

主要组件

  • ndk-build : 此脚本用于在 NDK 中心启动构建脚本。包含功能:
    • 自动探测开发系统和应用项目文件以确定要构建的内容
    • 生成二进制文件
    • 讲二进制文件复制到应用的项目路径
  • Java :
  • 原生共享库:NDK 从原生源代码构建这些库或 .so 文件
  • 原生静态库:NDK 也可以构建静态库或 .a 文件
  • Java 原生接口(JNI):JNI 是 Java 和 C++ 组件用以互相沟通的接口
  • 应用二进制界面(ABI):定义应用的机器代码在运行时如何与系统交互。NDK 根据这些定义构建.so 文件。不同的 ABI 对应不同的架构
  • 清单:如果应用没有 Java 组件 ,必须在清单中声明 NativeActivity
  • Android.mk :必须在 jni 文件夹内创建 Android.mk 配置文件。ndk-build 脚本将查看此文件,其中定义了模块及其名称、要编译的源文件、版本标志以及要链接的库。
  • Application.mk :此文件枚举并描述应用需要的模块。包括:
  • 用于针对特定平台进行编译的 ABI
  • 工具链
  • 要包含的标准库

构建

Android.mk

Android.mk 文件位于项目 jni/ 目录的子目录中,用于向构建系统描述源文件和共享库。定义 Application.mk、构建系统和环境变量所未定义的项目范围设置。
Android.mk 的语法用于将源文件分组为模块。模块是静态库、共享库或独立可执行文件。

包含内容
  • 必须首先定义 LOCAL_PATH 变量:

    # 表示源文件在开发树种的位置。构建系统提供的宏函数 my-dir 将返回当前目录(包含 Android.mk 文件本身的目录)
    LOCAL_PATH := $(call my-dir)
    
  • CLEAR_VARS 指向特殊 GNU Makefile,在描述每个模块之前,必须声明此变量

    include $(CLEAR_VARS)
    
  • LOCAL_MODULE 存储要构建的模块的名称。构建系统在生存最终共享库文件时,会添加 lib 前缀(模块名不以lib开头)和 .so 后缀

    # 每个模块名称必须唯一,且不含任何空格。
    LOCAL_MODULE := module-name
    
  • LOCAL_C_INCLUDES 指定相对于 NDK root 目录的路径列表,在编译所有源文件时添加到 include 搜索路径

    LOCAL_C_INCLUDES := xx/xx
    
  • LOCAL_SRC_FILES 包含要构建到模块中的 C 或 C++ 源文件列表

    LOCAL_SRC_FILES := 
    
  • LOCAL_CFLAGS 为构建系统设置在构建 C 和 C++ 源文件时要传递的编译器标志。

  • LOCAL_STATIC_LIBRARIES 存储当前模块依赖的静态模块列表

  • LOCAL_SHARED_LIBRARIES 此模块在运行时依赖的共享库模块列表

  • LOCAL_LDILIBS 包含在构建共享库或可执行文件时要使用的其他链接器标志列表

  • BUILD_SHARED_LIBRARY 帮助系统将所有内容连接到一起

    # 指向 GNU Makefile 脚本,用于收集在 `LOCAL_XXX`变量中提供的所有相关信息,以及确定如何从列出的源文件构建目标共享库。
    include $(BUILD_SHARED_LIBRARY)
    

Application.mk

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

变量
  • APP_ABI
    可以使用 APP_ABI 选择不同的 ABI。默认情况下,NDK 构建系统为 armeabi ABI 生成机器代码。

  • APP_PLATFORM
    包含目标 Android 平台的名称。

  • NDK_TOOLCHAIN_VERSION
    选择 GCC 编译器的版本。

ndk-build

ndk-build 文件为一个 shell 脚本,用途是调用正确的 NDK 构建脚本。

猜你喜欢

转载自blog.csdn.net/weixin_36453463/article/details/84635349
ndk