【问题标题】:Where is Android.mk supposed to be?Android.mk 应该在哪里?
【发布时间】:2016-03-26 03:14:37
【问题描述】:

在 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 文件,因为这是它与应用程序范围Application.mk 文件的区别,但是当我执行ndk-build我得到以下错误信息:

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

据我所知,我应该在 Application.mk 文件旁边创建一个 Android.mk 文件,或者在 Application.mk 中定义 APP_BUILD_SCRIPT 以指向单个 Android.mk 文件。这与文档相矛盾,让我想知道为什么在 Android.mk 将包含所有模块的定义时还需要多个 makefile ——这也可以放在 Application.mk 中。

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

缺少什么?

【问题讨论】:

    标签: android makefile android-ndk


    【解决方案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.mk 在设计上与 Application.mk 正交。如果 Android.mk 包含 3 个模块,Application.mk 2 个 ABI(例如 arm 和 x86),则 NDK 将构建 (3 * 2) 个工件。
    4. 来自Application.mk 的变量出现在Android.mk 中,因此您可以使用例如Android.mk 中的APP_ABI 来链接架构相关库。
    5. 有些复杂的项目包含大量的 makefile,在 Application.mk 中保留常用选项是一种简洁的方式。
    6. Application.mk 仍然只是一个设计决策,它本可以采用不同的方式。

    【讨论】:

      【解决方案2】:

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

      您可以定义放置它们的位置,这还取决于您如何构建代码 - 例如,如果您使用“ndk-build”和命令行命令构建 ndk 的任务,则将文件夹路径作为参数传递.通常,根据我的经验,它们位于 jni 文件夹下。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-04
        • 2012-02-17
        • 2018-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-06
        • 1970-01-01
        相关资源
        最近更新 更多