Fresco引起的在arm64位机器上找不到对应的so库

原创 2016年03月09日 15:14:52

背景

今天公司项目的应用,测试人员提了个bug,应用在查看pdf文档时崩溃了,看了下崩溃日志。

java.lang.UnsatisfiedLinkError: dlopen failed: "libs/armeabi-v7a/libmupdf.so" is 32-bit instead of 64-bit

libmupdf.so就是mupdf编译来的so库,意思是说该so是32位的,需要使用64位替代。确实,之前项目一直使用的是32位的,但是也有用64位的机器测过(红米note3),之前遇到的是部分手机不能加载so文件,couldn’t find *.so 这篇文章提到的问题,也解决了,能正常使用了。但,今天同一台机子,却不能使用了,想想,在这两个版本的迭代过程中,引入的库也就只有Fresco了,经过排查,问题真就出在这了。

问题

lib项目

这是最新应用的lib下的目录结构,然后同样打旧版本包的lib目录,发现,旧的包只有armeabi-v7a这个文件夹,再查看各个文件夹下的文件,又发现,新版本的包中确实只有在armeabi-v7a文件夹下有libmupdf.so文件,其他文件夹下的都是fresco的so文件,而armeabi-v7a存放的是32位的so文件。

问题原因

64位机器默认去查找是否存在arm64-v8a目录,如果存在,就会使用(加载)该目录下合适的64位库,如果没有则回去lib下查找32位的库,而fresco的draw-pipeline太完善了考虑了64位的机器所以他的arm64-v8a下有so库,对应的系统就创建了lib 64的文件,而不再去找32位的库。但是,我们的项目中只有armeabi-v7a 32位库,以至于机器在查找到arm64-v8a目录下加载不到libmupdf.so库,然后就崩溃了。

解决方案

解决的办法当然是,让机器如何加载到我们的so文件了,那么有如下几种方案:

  1. 编译其他CPU型号对应的so文件
    如果按fresco适配的型号,那么我们要重新编译其他arm64-v8a、armeabi、x86、x86_64等4个型号的so文件,我们项目中只有mupdf这个有源码,还有其他so文件是没有源码的,再者,如果要编译的项目多,那么是多么耗时的一件事,所以,目前来看这个方案不是最佳的。

  2. 改变fresco的引用方式
    目前fresco的引用方式,是使用gradle的添加库依赖的方式
    compile ‘com.facebook.fresco:fresco:0.9.0’
    那么,如果要解决上面的问题,就要改变引用的方式:
    去掉gradle的依赖,将fresco源码clone下来自行编译,然后将armeabi-v7a目录下的so文件拷贝到项目的lib/armeabi-v7a文件夹下,接着拷贝如下几个module的aar文件
    这里写图片描述
    最后,就是Android Studio引入aar。关于怎么引入,可以自行查阅资料,或者有需要的话,我会在另外写一个。
    最后,你发现这种方法动的地方很多,还是很麻烦,有没有更简单的?接着看第三种方案。

  3. 修改gradle配置(究极方案)
    可以说这个方案是最完美的解决方法了,简单一本万利!
    fresco的引用还是使用gradle的compile来添加依赖,只是打开项目的build.gradle然后添加如下配置:
android {
    defaultConfig {
        ndk {
            abiFilters 'armeabi-v7a'
        }
    }
}

ndk的abiFilters属性,填写的是需要的CPU型号,比如我只要arm32位的,所以只填写了armeabi-v7a。ok,完美解决!

参考资料:
fresco issue#504
fresco issue#458

版权声明:本文为博主原创文章,未经博主允许不得转载。

"Caused by: java.lang.UnsatisfiedLinkError: Library hello-jni not found“问题解决

现象: 调用libhello-jni.so时,出现“Caused by: java.lang.UnsatisfiedLinkError: Library hello-jni not found”问题。...
  • liranke
  • liranke
  • 2013年11月20日 09:41
  • 5003

Android内嵌MuPDF打开PDF文件

一、基本实现         二、JNI调用 三、使用细节注意         1,包名一致【JNI调用规则】         2,so库的注意事项...

Android集成Fresco框架导致在64位机器上(三星S6,华为P8等)找不到其他so库

这个问题困扰了我好几天,今天终于解决了,记录一下 参考:http://www.cnblogs.com/poe-blog/p/4728970.html 声明:这是从网上找到的一个解决方案,不...

筛选菜单--弹性式RadioGroup(可自动换行)

演示效果实现了自动换行的RadioGroup,而不再局限于只能把RadioButton放在一行或一列,并实现了点击单个RadioButton时,点击选中,再点击取消看代码FlexRadioGroup继...

Java中的一些基础知识点

本篇博客写的都是上课学习Java的时候所记录的一些笔记(还是比较篇概念的内容),所以可能内容不是很全面、或许也很杂,内容都是从基础一点点往后增加的。转载请注明出处:http://blog.csdn.n...
  • a_zhon
  • a_zhon
  • 2016年09月19日 22:37
  • 727

android studio 64位手机+Fresco引起的在arm64位机器上找不到对应的so库

我们的程序在32位机器上没有问题,有一天公司采购了一台魅族MX5 MTK的64位处理器上我们的应用报错了 "nativeLibraryDirectories=[/data/app/com....

Android Studio上打的包在arm64位机器上找不到对应的so库

现象描述  Android Studio打出来的包在64位机器上报以下  Java.lang.UnsatisfiedLinkError: dlopen failed: “libfoobar.so”...

Android Studio上打的包在arm64位机器上找不到对应的so库

现象描述 Android Studio打出来的包在64位机器上报以下 java.lang.UnsatisfiedLinkError: dlopen failed: “libfoobar.so”我们...

opencv2.1移植arm 出现找不到libcv.so not found (try using -rpath or -rpath-link) 及大量 undefined reference的解决

先介绍下环境:pc(虚拟机)+ubuntu11.10+qt4.8+arm6410(飞凌的),申明下解决onot found (try using -rpath or -rpath-link)的方法是换...

ubuntu 12 64位系统 装arm-linux-gcc 4.3.2 找不到文件

环境变量:/usr/local/arm/4.3.2/bin:/usr/local/arm/4.3.2/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr...
  • sonbai
  • sonbai
  • 2013年03月07日 21:38
  • 8244
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Fresco引起的在arm64位机器上找不到对应的so库
举报原因:
原因补充:

(最多只允许输入30个字)