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

and*_*per 26 java-native-interface android cpu-architecture android-ndk

背景

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

问题

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

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

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

APP_ABI:= armeabi armeabi-v7a x86

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

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

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

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

Ale*_*ohn 31

如果您没有设置APP_ABI,或使用

APP_ABI := all
Run Code Online (Sandbox Code Playgroud)

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

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

这种方法的一个缺点是,如果本机库很大,那么您的"单片"APK文件可能会变得庞大.您可以使用多APK方法使用户下载更小.在官方网站的建议:你一般应使用多个APK来支持不同的设备配置,只有当你的APK过大(大于50MB) .如果选择此路线,则应仔细遵循版本代码guildlines.

不幸的是,关于Google TV上的NDK支持没有值得信赖的预言,但目前的不可用性似乎没有技术上的合理性.如果它到达,你的ndk-build将自动处理它.

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


han*_*ach 5

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

APP_ABI := all
Run Code Online (Sandbox Code Playgroud)

要么

APP_ABI := armeabi armeabi-v7a x86 mips
Run Code Online (Sandbox Code Playgroud)

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

  • 我在我的mk文件中有APP_ABI:= armeabi armeabi-v7a x86 mips,我仍然只在输出中获得armeabi.还缺少什么? (3认同)
  • 有些人把这条线放到Android.mk并抱怨它没有用.您必须创建名为Application.mk的文件 (3认同)
  • 我不明白.你是说添加"APP_ABI:= all"是不够的?如果这是真的,那该怎么办呢? (2认同)