Android.mk应该在哪里?

时间:2015-12-19 15:00:25

标签: android makefile android-ndk

在Android NDK的文档中,存在以下声明:

  

Android.mk文件位于项目的jni /目录[...]的子目录中   http://developer.android.com/ndk/guides/android_mk.html

我可以从中解释一个Android.mk文件应放在[project_path]/jni/[module_name]/Android.mk中,每个模块都有自己的特定Android.mk文件,因为这是它与应用程序范围的区别{{ 1}}文件,但是当我执行Application.mk时,我收到以下错误消息:

  

Android NDK:./jni下没有Android.mk      Android NDK:如果这是故意的,请将APP_BUILD_SCRIPT定义为指向
     Android NDK:到有效的NDK构建脚本。

我从那里开始收集我应该在我的ndk-build文件旁边创建一个Android.mk文件,或者在Application.mk中定义APP_BUILD_SCRIPT以指向一个Application.mk文件。这与文档相矛盾,让我想知道为什么当Android.mk将包含所有模块的定义时,需要多个make文件 - 这些文件也可以放在Android.mk中。

阅读几个NDK示例项目我发现,Application.mk文件确实与Android.mk位于同一目录中,并且对它们执行Application.mk似乎有效。

缺少什么?

2 个答案:

答案 0 :(得分:1)

预期的项目结构

<project>/
 |
 +-- jni/
 |    |
 |    +-- Android.mk
 |    +-- [Application.mk] (optionally)
 |    +-- main.c
 |
 +-- AndroidManifest.xml

根据此处的简短指南:https://developer.android.com/ndk/guides/concepts

  1. 在项目的jni /目录中创建一个Android.mk文件
  2. ...使用ndk-build编译您的本机代码
    $ cd <path>/<to>/<project>
    $ <ndk>/ndk-build
    

但是,有一种方法可以使用带有参数的ndk-build来定义自定义NDK项目结构。

普通结构

<mylib>/
 |
 +-- Android.mk
 +-- [Application.mk]
 +-- main.c
$ cd <mylib>
$ ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=Android.mk

Android.mk与Application.mk

当Android.mk无论如何都包含所有模块的定义时,为什么需要多个makefile-也可以将它们放置在Application.mk中。

  1. Android.mk是必需的,而Application.mk不是必需的。
  2. Android.mk包含模块定义,Application.mk描述体系结构,编译器选项和其他“全局”选项。
  3. Android.mkApplication.mk正交。如果Android.mk包含3个模块,并且Application.mk包含2个ABI(例如arm和x86),则NDK将构建(3 * 2)个工件。
  4. Application.mk中的变量出现在Android.mk中,因此您可以使用例如APP_ABI中的Android.mk来链接与体系结构相关的库。
  5. 有些项目包含大量的makefile,而在Application.mk中保留通用选项是一种干净的方法。
  6. 但是Application.mk仍然只是设计决定,本来可以完成的。

答案 1 :(得分:0)

我至少可以回答你的一些问题。你说文档有点令人困惑是正确的。如果您使用的是单个本机模块,那么Application.mk确实可能看起来多余 - 但是,有一些事情只能由Application.mk设置(您可以在这里查看:Application.mk)。 Application.mk适用于适用于所有模块的设置,而Android.mk适用于特定模块设置。实际上,通常简单的项目只有一个Android.mk,它与Application.mk位于同一个文件夹中。

您可以定义放置它们的位置,这也取决于您构建代码的方式 - 例如,如果您正在使用任务来构建ndk,请使用&nbspk-build&#39;和commandLine命令,您将文件夹路径作为参数传递。通常,根据我的经验,它们位于jni文件夹下。