java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader错误记录

错误分析:

        加载.so包报错,在这个错误后面一般还会跟一串路径,在这个路径下面没有找到当前需要的.so包.一般是程序在运行过程中调用System.loadLibrary(“xxxxxxxx”)的时候报错的.

解决思路:

        检查自己是不是把libxxxxxx.so文件放在正确的位置,然后重新打包。

        so包放的位置分为两种,一种是放在libs文件夹下面(一般是兼容以前的Eclipse的工程),一种是放在jniLibs文件夹下(现在用AndroidStudio新建的工程一般都是这种).

        放在libs文件夹的要在在model下的build.gradle中的android内添加以下代码:

sourceSets {
    main {
        jniLibs.srcDirs = ['libs']
    }
}

        放在jniLibs文件夹的不需要以上操作,但是一定要注意文件的位置有没有放对地方,jniLibs文件夹要新建在工程main目录下,其他地方就要上述操作指定位置了.

        上述操作完后还是继续报错.查看NDK是不是排除了你的设备架构,看你的代码里是否添加了如下代码:

android {
    defaultConfig {
        ........//此处省略其他设置
        ndk {
            abiFilters  "armeabi"
        }
    }
}

        这个设置就是只加载armabi架构(目录下)的so库,如果是别的架构,就会找不到。

解决:
        可以添加自己需要的架构,这样做的好处是apk体积可以变小代码.

放置 .so 文件的正确姿势:
        • 为了减小 apk 体积,只保留 armeabi 和 armeabi-v7a 两个文件夹,并保证这两个文件夹中 .so 数量一致
        • 对只提供 armeabi 版本的第三方 .so,原样复制一份到 armeabi-v7a 文件夹
存放so的规则:
        你应该尽可能的提供专为每个ABI优化过的.so文件,但要么全部支持,要么都不支持:你不应该混合着使用。你应该为每个ABI目录提供对应的.so文件。

        除了上述原因外还有可能是so库对应的架构不正确,这个就得找so库提供者了.

额外记录下加载so库的方法:

1.System.load(): 参数为库文件的绝对路径,可以是任意路径。

2.System.loadLibrary():参数为库文件名,不包含库文件的扩展名。在使用时去掉名字前面的lib和后面的.so

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值