android - 如何将现有的 make 文件与 Android NDK 合并

标签 android c android-ndk makefile

所以我有一个巨大的现有 C 项目,我已将它放在 $PROJECT/jni 目录中。这个项目通常是通过运行一个配置脚本来创建的,该脚本创建 Makefiles 然后允许通过 make 编译项目。

这个项目比较大,有很多包含源文件和头文件的目录。

我想我在这里缺少对 Android.mk 应该如何工作的基本理解。是否应该替换当前用于编译项目的配置和生成文件?或者我会将配置脚本中生成的 makefile 合并到 Android.mk 中吗?他们提供的示例非常简单,只有几个源文件。我的 jni 目录看起来更像:

jni/
  folder1/subfolder1
  folder1/subfolder2
  folder1/source
  folder2/source
  .....
  foldern/source
  configure/
  configure/configure.sh
  Makefile
  Android.mk

生成的 makefile 非常广泛(大量配置,每个目录都有一个),所以我不知道如何处理这个问题。

编辑:

主要问题是 NDK 附带的示例是微不足道的示例。他们在顶级 jni 目录中有 3-5 个源文件。我的问题是这是一个庞大的项目,配置复杂,有 4 个顶级文件夹,每个文件夹都有许多子目录。我不能简单地将源代码移动到 jni 文件夹并运行 ndk 编译器。

最佳答案

回答您的问题,是的Android.mk Android 构建系统。谷歌几乎没有提到这个文件的“语言”是作为 GNU make 宏实现的。文档希望您根据这些宏来描述您的项目。他们处理所有蹩脚的交叉编译细节。随着开发工具的发展,我很确定 Google 已经采用这种方法来提高 Android.mk 文件的向前可移植性。

结果是(我知道你不会想听到这个)最好的答案可能是从头开始为你的大项目编写一个合适的 NDK Android.mk

This article列出了与我移植大约 800 个文件和 300k SLOC 的库相同的观察结果。不幸的是,我花了将近两个星期才得出相同的结论:交叉编译导致至少一些 configure 脚本失败(导致错误的 config.h 文件)。我“发明”了与他在文章中使用的几乎相同的技术。但是即使在我得到一个干净的构建之后,生成的静态库也不能完全工作。数小时的调试没有得到任何有用的信息。 [警告:我不是配置工具专家。一位大师可能会发现我的错误。就这样。] 我花了几天时间来创建一个干净的 Android.mk。生成的库第一次运行所有测试。它已经通过几个版本的开发工具干净地移植了。

不幸的是,在没有自动工具的情况下构建使用 configure 的库意味着为目标环境手动构建自己的 config.h。这可能不像听起来那么糟糕。 IME 系统倾向于在其 configure 环境中定义比实际使用更多的内容。清楚地了解真正的依赖关系可能会在未来的重构中返回繁琐的工作。

文章的摘要说明了一切:

Autotool is good only on GNU systems and using it for cross compiling can be really tedious, confusing, error prone or even impossible. The method described here is a hack and should be used at your own risk.

抱歉,我没有更积极的建议。

关于android - 如何将现有的 make 文件与 Android NDK 合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17352005/

相关文章:

android - 带 -mfloat-abi=hard 的 armeabi-v7a

android - AsyncTask 文件下载时 ListView 中的进度条

在嵌套循环中访问数组时缓存未命中

java - Android Studio : generating . so文件使用实验性插件

android - 我的 Android 应用程序的某些用户遇到不满意的链接错误

c - Mallocing char* 与另一个 char* 长度相同会导致它成为副本吗?

android - 在应用程序本身内更改区域设置

android - Gradle 同步失败 : Could not find method compile() for arguments [com. android.support :appcompat-v7:25. 3.1]

java - 尝试使用 Google 登录凭据在 Firebase 上重新进行身份验证时出错

c - 编写 C 程序在 Linux 上创建一个 1 MB 的文件并出现段错误