android - 如何使用 NDK 定位多个架构?

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

背景

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

问题

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

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

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

APP_ABI := armeabi armeabi-v7a x86

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

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

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

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

最佳答案

如果你根本不设置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 会自动处理它。

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

关于android - 如何使用 NDK 定位多个架构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14420312/

相关文章:

android - 如何检查一个方法是否没有被 mockk 调用?

java - 从 Firebase 数据库中检索特定值到字符串变量

android - Kindle Fire状态栏和软键栏bug

java - 创建对象时出现 IllegalMonitorStateException

android - 使用 Dagger 将 android.content.Context 注入(inject)构造函数

java - 通过 parcelable extra 检索时为空对象

Android NDK - 在配置更改时强制库重建

android - Android API 级别从 18 更改为 17,但 android 从来没有 "Boots Up"

android - 从 Android 升级 STM32 设备固件 (DFU/DfuSe)

java - 通过 JNI 从 C++ 返回空字符串到 Java