如何查询当前手机的cpu架构,so库导入工程又出异常了?
执行adb命令:
adb shell
cat /proc/cpuinfo
对应文件夹
AArch64 == arm64-v8a
ARMv7 == armeabi-v7a
............等
其他你们自己发现吧。
注意:这里我要说明一个开发中要注意的问题.
首先说明下android studio中apk打包so文件的机制和机器自动选择so库文件执行的问题
1.apk打包会把工程中出现的armeabi等文件按照原来的文件名直接打包到apk中,如果多个module中有相同的文件夹,会把module中的so文件合并成到一个文件夹中来。
例如: module中有so文件夹armeabi,armeabi-v7a,x86,x86_64,(记住armeabi中具体的几个so文件)
module中有so文件夹armeabi,armeabi-v7a,x86(记住armeabi中具体的几个so文件)
那么最后打包生成的apk文件中是这样的
很明显两个module中的相同文件夹下so文件合并了到一起了,那么说明apk最后会合并so文件。如果你的两个module中有一个有另一个没有的so文件夹及内容,apk依然会合并so文件夹,只是里面只有一个module中的so文件。例如上面图片中,第一个module中就有"x86_64"这个文件夹,而第二个module中就没有,但apk中会发现里面是有这个文件夹的,只是里面只有一个module中的so文件,这里就会引发一个问题,想知道就往下看。
2.打包完成后的apk文件安装到手机中,手机会根据自己cpu的架构选择对应的so文件夹执行so文件,目前的手机有多种cpu架构 ,如:armeabi,armeabi-v7a,arm64-v8a,x86,x86_64等,你会发现这个和我们上面android工程中的so文件夹名称是一致的,这也说明了手机会选择执行so文件夹中的文件。(注意:arm64架构的cpu,如果在apk中找到了arm64-v8a的文件夹,那么就会直接在里面找到要执行了so库文件,如果没有这个文件夹就会找armeabi文件下的so文件执行)
了解了上面了知识再来看下面:
1.如果你的android studio工程中使用了多个module,并且module中都加入了so库文件,例如这样:
那么你就要注意下,如果你的手机是arm64架构的那么按照上面的知识我们会知道,手机自动会去找arm64-v8a这个文件夹下的so文件,找不到该“文件夹”的话就去找armeabi文件夹下的so文件执行,那么按照上面的图,手机会找不到文件夹,最后选择找了armeabi文件夹,很好没有错。
但是,如果现在有个x86_64架构的手机那么按照之前的知识,手机一旦发现有x86_64这个文件夹就不会去找其他的文件夹,认定了这个文件夹中的so文件执行,那么你在操作app过程中点到或触发了需要用到第二个module中的so文件时,我们会发现这个文件夹中根本没有第二个module的so文件,那么很不幸这个会报错,报的是找不到so文件 "java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader couldn't find "(某个).so" 那么现在你应该懂了是什么原因,明明我有so文件会什么会提示找不到呢?这就是原因.
如果你理解到这儿了,也许有的同学很淡定的复制第二个module中的x86文件夹然后改个名字变成x86_64,以为这样就可以了,可以很明确的告诉你GG吧,这样会报一个错就是 “Java.lang.UnsatisfiedLinkError: 32bit can't 64bit” 也就是不能把32位文件转化为64位,虽然建文件夹是建对了,但so文件也不是乱用的。解决方案:去找找64位的so文件吧。
现在我希望大家能明白一点了,谢谢阅读,有错误请指正谢谢.
- 如何查询手机当前基站编号信息
- ios如何在当前工程中导入另一个工程文件(添加编辑新建的FramesWork)
- IOS如何在当前工程中导入另一个工程文件
- IOS如何在当前工程中导入另一个工程文件
- iOS开发——创建你自己的Framework && IOS如何在当前工程中导入另一个工程文件
- android中如何判断Android手机当前是否联网?
- iOS项目工程结构,数据流思想和代码规范 工程结构架构,减少耦合混乱以及防治需求大改造成结构重构,如何构建稳定可扩展可变换的工程结构的思考
- 如何实现android手机扫描条码到数据库查询信息并打印
- 架构师是如何炼成的?以天猫APP架构&开发模式升级工程为例
- 如何通过php把当前时间导入mysql
- 安卓工程如何正确导入第三方jar (2) ---解决问题【intellij+gradle+android-support-multidex.jar】
- PostgreSQL中如何查询在当前的哪个数据库中
- 如何将SDK中的ApiDemos导入android手机中
- Android端如何获取手机当前的网络状态,比如wifi还是3G, 还是2G, 电信还是联通,还是移动
- 如何把Eclipse工程导入到Android Studio
- 如何检测手机当前为“桌面”(desktop)状态
- iOS如何往当前工程再添加一个工程
- 如何查看文件支持的CPU架构
- linux系统cpu、内存、磁盘IO异常查询方式汇总
- 如何查询iphone序列号验证手机真伪