简介
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 构建脚本。
网友评论