我最近开始使用NDK开发一些代码,我想到了使用NDK开发时可能出现的可移植性问题。
由于NDK使用本机代码,因此需要按CPU架构进行编译。这是一个问题,因为无论设备具有什么CPU,用户都需要运行应用程序。
我注意到我可以修改文件“jni / Application.mk”并使用:
但是,我不知道从这一步开始我应该做些什么。该应用程序是否包含每个CPU架构的所有已编译代码,并在运行时自动选择正确的代码?APP_ABI:= armeabi armeabi-v7a x86
此外,如果有另一个未知的CPU架构怎么办?
如果我尝试在Google TV上运行应用程序会发生什么情况,根据我记得的内容根本不支持NDK?
我发现的另一个解决方案是多apk支持。但是,我不确定我理解它。这一切是否意味着您每次使用不同的配置创建相同的APK? ADT没有专门的自动化工具来帮助解决这个问题吗?
答案 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'