美文网首页
Android找不到so库解决方法

Android找不到so库解决方法

作者: 请叫我姐 | 来源:发表于2016-12-16 17:10 被阅读1210次

    背景

    工程项目中,有armeabi 、armeabi-v7a两个文件夹,而两个文件夹中的库文件不一样,编译运行的时候,报错java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader

    原因分析

    在android APK的根目录有一个libs文件夹,此文件夹下包含了armeabi 、armeabi-v7a两个文件夹,有时候会有x86的;一般c代码编译成的各种.so库就会放在这两个文件夹中。

    armeabi和armeabi-7a是表示cpu的类型,一般的手机或平板都是用arm的cpu,armeabi是针对普通的或旧的arm cpu,armeabi通用性强,但速度慢;armeabi-v7a是针对有浮点运算或高级扩展功能的arm cpu,速度快

    android的APP在安装时,会将APP中的so库拷贝到一个指定的目录(ApplicationInfo.nativeLibraryDir),运行时就在这个指定的目录下查找对应的so库。查找不到则会报错。

    1. 在android4.4以下版本的安装过程中的,是先把所有so库全部寻找出来,然后优先列出cpu类型(通过ro.product.cpu.abi属性获得)目录下的so库,如果有其他的cpu类型下有跟手机cpu类型名称不一致的so库,则会将兼容cpu架构(通过ro.product.cpu.abi2属性获得)的另外的库也列出来。将列出来so库全部拷贝的系统指定目录,以供运行时加载。 即在android4.4以下版本,一个so库只要在 ro.product.cpu.abi和ro.product.cpu.abi2属性目录下至少存在一个就可以了。在android4.4以下的arm架构的设备 ro.product.cpu.abi的属性通常是armeabi-v7a, ro.product.cpu.abi2的属性值是armeabi,并且armeabi-v7a设备一定兼容armeabi。但不排除某些设备的ro.product.cpu.abi的属性为armeabi。

    2. 在android5.0及以上,由于增加了arm64的支持,app安装时的so库拷贝代码也修改了。修改成只拷贝一个最合适的目录下的so库到系统指定目录。 在arm架构下,64位cpu的优先级是arm64-v8a > armeabi-v7a > armeabi,32位cpu的优先级是armeabi-v7a > armeabi ,优先级可通过ro.product.cpu.abilist属性查看。由于android5.0是拷贝整体目录,所以在每一个目录下的,都必须要有完整的so,即所有app需要so库都要有。例如64位的cpu的设备上,
      如果app目录里存在arm64-v8a子目录,则只拷贝该目录下的so库,其他目录的so,即使名称不一样,也不拷贝,如果arm64-v8a子目录的so库不全,则会报错。

    解决方法

    1. apk中要么增加armeabi文件夹,需要注意的是,假如增加armeabi文件夹,armeabi-v7a里面的so库一定需要全部拷贝过来,否则还是会报错。

    2. 可以删除了armeabi-v7a文件夹,保留armeabi文件夹。

    相关文章

      网友评论

          本文标题: Android找不到so库解决方法

          本文链接:https://www.haomeiwen.com/subject/gmwnmttx.html