28

背景

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

问题

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

到目前为止我找到的可能的解决方案

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

APP_ABI := armeabi armeabi-v7a x86

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

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

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

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

4

2 回答 2

33

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

APP_ABI := all

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

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

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

不幸的是,关于 Google TV 上的 NDK 支持没有可靠的预言,但目前不可用似乎没有技术上的理由。如果它到达,您的ndk-build将自动处理它。

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

于 2013-01-20T08:55:21.657 回答
5

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

APP_ABI := all

或者

APP_ABI := armeabi armeabi-v7a x86 mips

没有 ./ndk_build 只会构建“armeabi”

于 2014-02-14T10:06:27.770 回答