开发的一款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!
网友评论