Android库比主项目提供更少的本机库架构

时间:2016-09-16 16:08:43

标签: android android-ndk android-gradle build.gradle

我正在尝试将Polaris Viewer Kit SDK集成到我的项目中,但由于这个错误我被卡住了:

 Could not dispatch event: class com.myproject.documents.model.callback.DocumentCallback to subscribing class class com.myproject.documents.ui.DocumentListFragment
     java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/data/app/com.myproject-2/base.apk"],nativeLibraryDirectories=[/data/app/com.myproject-2/lib/arm, /system/fake-libs, /data/app/com.myproject-2/base.apk!/lib/armeabi-v7a, /system/lib, /vendor/lib]]] couldn't find "libEX_Engine7.so"

SDK仅为armeabix86架构提供本机库,但我的项目已经为armeabi-v7ax86_64提供了库。

所以我想,由于该项目提供了一些armeabi-v7a库,设备期望找到该架构的所有库。这是对的吗?

当库可用时,我可以采取哪些措施让设备使用armeabi-v7a,而当库不可用时,我可以回退到armeabi吗?

其他信息:我正在开发Android Studio 2.2 RC2,Gradle 2.14.1并在带有Android 7 DP5的Nexus 6上进行测试。

3 个答案:

答案 0 :(得分:1)

  

当库可用时,我可以做些什么来使设备使用armeabi-v7a,而当库不可用时,是否可以回溯到armeabi?

系统会自动执行此操作。如果设备支持armeabi但不支持armeabi-v7a则会使用armeabi。

问题是您的应用不支持armeabi-v7a,因为您使用的SDK不支持。除非您可以为armeabi-v7a重建SDK,否则您很可能只支持armeabi。

答案 1 :(得分:1)

操作系统只会从最匹配的单个文件夹中获取库。

例如: 如果你有

    使用 2
  • armeabi 1 库的
  • armeabi-v7a

armeabi-v7a 兼容设备上运行时,它会查找文件夹(按顺序)

  • armeabi-V7A
  • armeabi

它会立即找到文件夹( armeabi-v7a ),并且只会占用该帐户中的文件夹,从而找到 1

更多关于支持和选择abis:https://developer.android.com/ndk/guides/abis.html#am

ps。我前段时间有问题,我只支持 armeabi 平台,但其中一个依赖库确实支持所有abis,导致许多崩溃(不满意)链接错误)在非严格的armeabi设备上

答案 2 :(得分:0)

除了Dan Albert的回答,请记住armeabi和armeabi-v7a是二进制兼容的。因此,如果SDK仅提供armeabi,您实际上可以创建一个新的armeabi-v7a目录并将armeabi文件复制到其中,它将正常工作。它可能比为armeabi-v7a编译SDK的效率低。 (你不能对arm64-v8a或x86_64做同样的事情,因为那些架构不同于armeabi(-v7a)和x86。)

反过来说;如果你自己的应用程序中的本机代码对性能不敏感(实际上,如果它不使用大量的浮点运算),你不会因为遗漏armeabi-v7a版本而只是运输armeabi而失去很多性能,你将在二进制文件上保存一些大小。