【问题标题】:How to target multiple architectures using NDK?如何使用 NDK 定位多个架构?
【发布时间】:2013-01-03 10:13:19
【问题描述】:

背景

我最近开始使用 NDK 开发一些代码,并且我想到了在使用 NDK 进行开发时可能会出现的可移植性问题。

问题

由于 NDK 使用原生代码,因此需要根据 CPU 架构进行编译。这是一个问题,因为无论设备具有什么 CPU,用户都需要运行应用程序。

目前我发现的可能解决方案

我注意到我可以修改文件“jni/Application.mk”并使用:

APP_ABI := armeabi armeabi-v7a x86

但是,我不知道从这一步开始我应该做什么。应用程序是否包含每个 CPU 架构的所有编译代码,并在运行时自动选择正确的代码?

另外,如果会有另一个未知的 CPU 架构怎么办?

如果我尝试在 Google TV 上运行该应用程序会发生什么,据我记得它根本不支持 NDK?

我发现的另一个解决方案是多 apk 支持。但是,我不确定我是否理解它。这是否意味着您每次都使用不同的配置创建相同的 APK?没有来自 ADT 的特殊自动化工具来帮助解决这个问题?

【问题讨论】:

  • "应用程序是否会包含每个 CPU 架构的所有编译代码,并在运行时自动选择正确的代码?" -- 是的。
  • “没有来自 ADT 的特殊自动化工具来帮助解决这个问题?” -- 不,因为假设您需要不同的代码来处理不同的环境。如果您确实不需要需要不同的代码,那么您很可能不需要多个 APK。
  • 不错。你为什么不把答案放在一个真实的帖子里?另外,你能回答其他问题吗?这很有趣。
  • 您是否尝试运行ndk-build 并为库定义APP_ABI := armeabi armeabi-v7a x86?我只能得到它来构建armeabindk-build 忽略其他架构。
  • 我刚刚使用了所选答案上的内容,对我来说效果很好:APP_ABI := all

标签: android android-ndk java-native-interface cpu-architecture


【解决方案1】:

如果你根本不设置APP_ABI,或者使用

APP_ABI := all

在您的 Application.mk 中,然后 ndk-build 将为您的 NDK 版本支持的所有架构构建。迄今为止,最新的 r8d 将在 armeabi armeabi-v7a x86 之外为 mips 构建。当另一个架构发布时,您有望自动获得构建来支持它的 APK。

当您的应用程序安装在 Android 设备上时,系统会自动选择匹配的 ABI 版本并从 APK 安装正确的共享库。

这种方法的一个缺点是,如果原生库很大,您的“单体”APK 文件可能会变得很大。您可以使用多 APK 方法来减少用户下载量。 official site 建议:只有当您的 APK 太大(大于 50MB)时,您才应该使用多个 APK 来支持不同的设备配置。如果你选择这条路线,你应该仔细遵循版本代码准则。

很遗憾,没有关于 Google TV 支持 NDK 的可靠预言,但目前不可用似乎没有技术上的理由。当它到达时,您的 ndk-build 会自动处理它。

UPDATE Here 是维护拆分 APK 的简单过程。顺便说一句,新的 Android TV 确实支持 NDK。

【讨论】:

  • 我明白了。多 apk 方法是否有一个内置工具来同时创建 apk?另外,编译时是否也支持intel?
  • @Alex Cohn:与关于 Google TV 上 NDK 不可用的技术理由相比,blog post 提供了一些细节:我了解到 Sony GTV 运行的是 EGlibc 2.12.2 ,并且可能是它的大部分未修改版本。拥有 [AT] google.com 电子邮件地址的人表示,这样做的原因是他们无法让 Chrome 与 Honeycomb 仿生版本运行
  • @androiddeveloper:不,没有自动化工具,主要是(恕我直言)因为谷歌不想鼓励这种方法。版本代码等所有规则让多个 APK 令人头疼。
  • @deltheil:是的,我知道这个借口。长期以来,在 AOSP(ICS 和更高版本)上运行的 Chrome 版本。 OTA升级对GTV来说确实很难,但主要是索尼没有准备这样的升级。
  • 你是说所有的谷歌电视仍然使用蜂窝?甚至没有人使用ICS及以上?如果没有,他们支持 NDK 吗?另外,关于多个 APK,google 在他们的一个 google IO 讲座中谈到了它,讲师们惊讶地发现开发人员实际上想要这个功能很长时间。这很成问题,因为我认为应该有所不同。例如,许多应用程序都有“普通”和“高清”版本,这很愚蠢。使用单个 apk 会占用大量空间,但使用 2 个应用而不是一个也很愚蠢。
【解决方案2】:

对于最新版本(现在是 r9),您必须在“jni/Application.mk”中指定

APP_ABI := all

APP_ABI := armeabi armeabi-v7a x86 mips

没有 ./ndk_build 只会构建 'armeabi'

【讨论】:

  • 这就是其他答案已经写的:stackoverflow.com/a/14423013/878126
  • 我不明白。您是说添加“APP_ABI := all”还不够吗?如果是真的,那该怎么办?
  • 我的 mk 文件中有 APP_ABI := armeabi armeabi-v7a x86 mips,但输出中仍然只有 armeabi。还缺少什么?
  • 我也有同样的问题。它只为 armeabi 构建
  • 有些人将该行放到 Android.mk 中并抱怨它不起作用。您必须改为创建一个名为 Application.mk 的文件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-29
  • 2014-03-13
相关资源
最近更新 更多