1 Android原生编程
1.1 基础概念的文档链接
1.2 【Q】:ndk-build
命令对于Application.mk
和Android.mk
文件的处理顺序是什么样的呀?
Note:
Google的官方文档里面并没有没有十分明确而详细地说明ndk-build
对于Application.mk
和Android.mk
文件的处理顺序。
(1)关于ndk-build
如何处理Android.mk
和Application.mk
文件的一些关键点
- JNI:Android NDK 项目需要一个
jni/
目录,其中包含了Android.mk
和其他相关的源代码文件。(因此,当项目根目录中不包含jni
目录就会报错) - Application.mk:这个文件是可选的,若存在则通常位于项目的
jni/
目录中。Application.mk
文件定义了适用于整个项目的设置,如目标Android平台版本、要构建的CPU架构类型等。如果Application.mk
存在于jni/
目录下,ndk-build
会首先读取它。 - Android.mk:这些文件位于项目的各个子目录中,并定义了如何编译这些目录中的源代码。每个
Android.mk
文件通常负责一个子项目或一个库。 - 执行顺序:
- 当在项目根目录中执行
ndk-build
时,它首先查找jni/
目录中的Application.mk
(如果存在)。 - 然后,它会递归地搜索
jni/
目录及其子目录中的所有Android.mk
文件,并根据这些文件中定义的依赖关系来确定编译顺序。 - 每个
Android.mk
文件通常会被单独处理,以构建该文件定义的模块。 - 如果
Android.mk
文件中定义了模块间的依赖关系,ndk-build
将按照依赖顺序进行编译。
- 当在项目根目录中执行
(2)具体的处理顺序可以通过查看ndk-build的源代码来了解
Phind:
虽然Google的官方文档没有明确说明这个处理顺序,不过,这个处理顺序是由ndk-build
的源代码决定的,可以查看其源代码来了解。你可以在以下链接找到ndk-build
的源代码:
[build/core - platform/ndk - Git at Google]
在这个链接中,你可以找到ndk-build
的源代码,包括Application.mk
和Android.mk
文件的处理顺序。
1.3 ndk-build
:本质上是由make调用的一系列Makefile脚本
Q:“ndk-build工具实际上是.mk脚本”,是吗?
Claude-instant-100k:
是的,你的理解是正确的。
可以这么总结ndk-build
:
- ndk-build本身是一系列
.mk
脚本文件。- 这些
.mk
脚本文件使用Make语法定义了 Android NDK 项目构建的规则和依赖。- 在执行
ndk-build
命令时,实际上会在底层调用 gnu-make 工具。- Gnu-make 会解析和执行特定的
.mk
脚本,从而实现自动化构建 Android NDK 项目。- Gnu-make 具体在Windows上使用的是
make.exe
。- 所以
ndk-build
本质上利用了Make语法的优势,实现了一个自动构建 Android NDK C/C++ 项目的脚本系统。- 因此并不是说
ndk-build
自己是用某种编程语言编写的,而是采用了Make这个DSL(领域特定语言)来进行自动构建流程。总之,你说“
ndk-build
实际上是.mk脚本”,这个理解是正确的。它利用了Make脚本的能力,但本身并不是使用某种编程语言开发的程序。
Troubleshooting
(1)出现错误"Android NDK: Could not find application project directory ! Android NDK: Please define the NDK_PROJECT_PATH variable to point to it. …\Android\Sdk\ndk\xxx…\build\core\build-local.mk:151: *** Android NDK: Aborting . Stop.
进行在学习Android原生项目构建时,尝试在NDK项目上一级目录中执行ndk-build
,出现错误:
Android NDK: Could not find application project directory !
Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.
C:\Users\xxx\AppData\Local\Android\Sdk\ndk\26.1.10909125\build…\build\core\build-local.mk:151: *** Android NDK: Aborting . Stop.
我感觉主要原因是,父目录作为根目录不包含jni
目录导致出错;