在新的系统中,我们发现zbar会出现不兼容情况,比如报lib/arm64/libiconv.so" has bad ELF magic
或者libzbarjni.so" is 32-bit instead of 64-bit
出现这种情况主要是我们在开发中用到arm64库或者arm64-v8a库的原因。
很久以前一般都只是用armeabi在做兼容。现在其实市面上主流的手机都支持armeabi-v7a和arm64-v8a。请看如下简介:
各版本的分析如下所示:
- mips / mips64: 极少用于手机可以忽略,有兴趣的可以百度一下。
- x86 / x86_64: x86 架构的手机都会包含由 Intel 提供的称为 Houdini 的指令集动态转码工具,实现 对 arm .so 的兼容,再考虑 x86 1% 以下的市场占有率,x86 相关的两个 .so 也是可以忽略的
- armeabi: ARM v5 这是相当老旧的一个版本,缺少对浮点数计算的硬件支持,在需要大量计算时有性能瓶颈
- armeabi-v7a: ARM v7 目前主流版本,一般市面上的骁龙系列或者麒麟系列的处理器绝大部分都是这种架构
- arm64-v8a: 64位支持
所谓的ARMv8架构,就是在MIPS64架构上增加了ARMv7架构中已经拥有的的TrustZone技术、虚拟化技术及NEON advanced SIMD技术等特性,研发成的。
综上所述建议大家兼容armeabi-v7a和arm64-v8a这两个,其他架构少之又少,armeabi基本淘汰所以现在就不怎么考虑了。对于一般项目来说,足够了。
下面讨论解决办法
1.删除其他包,只留armeabi-v7a与armeabi 这个基础包
2.在部分项目中可能不能删除其他包那么我们就需要 在build.gradle的android里的defaultConfig内添加如下内容:
defaultConfig {
ndk {
abiFilters "armeabi-v7a"
// abiFilters "arm64-v8a"
}
}
然后在项目中集成so文件的时候
只把armeabi-v7a的so文件夹copy到libs里面。
如果报错
[java] view plain copy
- Error:(15, 1) A problem occurred evaluating project ':app'.
- > Error: NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin. For details, see http://tools.android.com/tech-docs/new-build-system/gradle-experimental. Set "android.useDeprecatedNdk=true" in gradle.properties to continue using the current NDK integration.
请在 gradle.properties 中 添加
android.useDeprecatedNdk=true
想要更多的编程学习资料,请关注微信公众号:IT010101