如何使用NDK定位多个体系结构?

背景

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

问题

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

迄今为止我find的可能的解决scheme

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

APP_ABI:= armeabi armeabi-v7a x86

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

另外,如果还有另外一个未知的CPU架构呢?

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

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

  • Android资产,C,JNI
  • 如何在Eclipse中有效地调试用JNI包装的C代码? (Android Dev)
  • Androidvideo通过ffmpeg修剪
  • 在包含下划线的Android包名称中调用JNI函数
  • JNI- java.lang.UnsatisfiedLinkError:找不到本地方法
  • 如何使用JNI代码正确导入Android库?
  • Android - 加载库失败
  • android mupdf libmupdf.so运行时错误“找不到原生openFile的实现”
  • 如果你根本没有设置APP_ABI ,或者使用

     APP_ABI := all 

    在你的Application.mk中ndk-build将为你的NDK版本支持的所有体系结构build立。 最新的一个,到目前为止r8d,除armeabi armeabi-v7a x86版本也为mips 。 当另一个架构将被释放,你会希望自动获得的内置APK来支持它。

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

    这种方法的一个缺点是,如果本地库很大,你的“单片”APK文件可能会变得巨大。 您可以使用multi-APK方法来缩小用户下载量。 官方网站build议: 只有当您的APK过大(大于50MB)时,您通常应该使用多个APK来支持不同的设备configuration 。 如果您select此路线,您应该仔细遵循版本代码指南。

    不幸的是,在Google TV上没有关于NDK支持的可靠预言,但是目前没有任何技术上的理由。 如果当它到达时,你的ndk-build会自动处理它。

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

    对于最新版本(现在是r9),你必须在“jni / Application.mk”

     APP_ABI := all 

    要么

     APP_ABI := armeabi armeabi-v7a x86 mips 

    没有./ndk_build只会build立'armeabi'