[解决方法] AndroidStudio java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader

开发的一款APP,客户使用一直没问题,这款APP用到了NDK,因此包含一个库文件so。后来客户在一新款手机上运行程序直接Crash了。程序调试过程中,发现Crash日志提示

 java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/system/framework/org.apache.http.legacy.boot.jar", 
zip file "/data/app/com.scanner.sdk.ScannerSample-Q_s9va0DsxSlExTQhNtFA==/base.apk"],
nativeLibraryDirectories=[/data/app/com.scanner.sdk.ScannerSample-Q_s9va0DsxSlExTQhfNtFA==/lib/arm64, /system/lib64, /system/vendor/lib64]]] 
couldn't find "libFlashFWLib.so"

错误信息很明显,没有找到native 库文件。一开始有点困惑,因为.so文件的位置没有任何问题,而且之前的很多机型都适配没问题。经过一段时间的research和struggle之后,发现新机型为 64bit 处理器,但是我的应用中并未提供,找到症结所在,接下来就是解决方案了。
第一步:在module的build.gradle文件添加以下内容(ndk包括部分),这部分代码的含义是让程序运行时,使用filter指定cpu架构list目录中查找。

defaultConfig {
    ndk {
        abiFilters "armeabi-v7a", "armeabi", "mips"
    }
}

第二步:在gradle.properties文件最后添加一行:

android.useDeprecatedNdk=true

虽然新的ArmV8手机CPU架构是64位的,但是向前兼容32bit,性能肯定是有所下降,但是为了apk在不同手机的一致性,也只好做些牺牲了,如果对性能有追求的话,可以增加arm64-V8的so.
关于CPU架构的介绍网上有不少,可以自行查阅。
Good Luck!

你可能感兴趣的:([解决方法] AndroidStudio java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader)