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

时间:2013-01-20 00:07:18

标签: 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没有专门的自动化工具来帮助解决这个问题吗?

2 个答案:

答案 0 :(得分:30)

如果您根本没有设置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来支持不同的设备配置。如果选择此路线,则应仔细遵循版本代码guildlines。

不幸的是,关于Google TV上的NDK支持没有值得信赖的预言,但似乎没有技术上的理由证明其目前的不可用性。如果它到达,您的 ndk-build 会自动处理它。

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

答案 1 :(得分:5)

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

APP_ABI := all

APP_ABI := armeabi armeabi-v7a x86 mips

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