关于32位库和64位库相关的总结

android加载so文件的机制

apk在安装的过程中,系统就会对apk进行解析根据里面so文件类型,确定这个apk安装是在32 还是 64位的虚拟机上,如果是32位虚拟机那么就不能使用64位so,如果是64位虚拟机也不能使用32位so。而64位设备可以提供32和64位两种虚拟机,根据apk选择开启哪一种,因此说64位设备兼容32的so库。

具体机制,分下面四种情况: 1.假设apk的lib目录放置了32和64位两种so,那么安装时根据当前设备的cpu架构从上到下筛选(X86 > arm64 > arm32),一旦发现lib里面有和设备匹配的so文件,那么直接选定这种架构为标准。比如当前设备是64位并且发现lib有一个64位的so,那么apk会拷贝lib下所有64位的so文件到data/data/packageName/lib/目录(查看此目录需要ROOT)

 

 后面调用System.loadLibrary其实就是加载这个目录下的so文件,此时如果有某个64位so文件在我们项目的lib中没有提供,就会直接报错程序崩溃。因此这里如果放置部分功能32位so,部分功能放置放置64位so,即使用多进程来加载模型,也会报错崩溃。

 

2.apk的lib目录只放置32位so,参照上面原理,运行在32位设备是OK的。绝大多数64位设备也是OK的,不过x86的设备肯定会崩溃。假设现在运行在64位设备,然后在代码中动态加载64位so文件,会报错:so is 64-bit instead of 32-bit

3.apk的lib目录只放64位的so,那这个apk只能运行在64位的设备了,同理如果在代码中动态加载32位的so,会报错:so is 32-bit instead of 64-bit

4.apk的lib不放任何so文件,全部动态加载。安装在32位设备就只能加载32位so,安装在64位的设备系统会默认你的apk运行在64位虚拟机,此时动态加载32位so也是不行的。

https://stackoverflow.com/questions/45353090/how-to-mix-32-and-64-bit-so-files-in-an-app

大致意思就是,Android在安装apk的时候就已经决定了,加载32还是64位so只能选其一,但是可以尝试用c++源码编译64位的linux可执行文件,跳过JNI调用直接使用Runtime.exec用android的运行时来命令行调用。这样就可以在app中混合使用32和64位so了,但是这样无法解决有UI交互的功能。OK,我们项目的图形加载当然是有UI交互的,这个问题目前没有解决

 

32位 和 64位系统区别

1. 32位系统CPU一次可处理32位数据,即一次处理4个字节。

    64位系统CPU一次可处理64位数据,即一次处理8个字节。

    通俗一点说: 32位,就相当于你拥有32个工人,每次能完成32个工人的工作量

                           64位,就相当于你拥有64个工人,每次能完成64个工人的工作量

    总结: 由32位系统过渡到64位系统,CPU处理数据能力提升了一倍。

2.  来说说寻址能力

     内存中一个地址占用8bit,即一个字节,32位cpu含有32根地址线,寻址能力为2的32次方个字节,相当于4G内存(所以,如果我们装32位系统,安装8G内存实际上是没有用的)。而64位cpu理论上寻址能力为2的64次方个字节,但目前硬件还达不到这个水准,当然我们用不了这么大的内存。

     另外,补充两点:

     第一、

                1 Byte = 8 bit (8)

                1 KB = 2^10 Byte (1024)

                1 MB = 2^10 KB (1024)

                1 GB = 2^10 MB (1024)

                1 TB = 2^10 GB (1024)

     第二、

                64位系统下运行64位软件比32位系统运行32位软件要快,
                但是,64位系统运行32位软件跟32位系统运行32位软件速度应该是一样的 。

     总结: 64位CPU有更大的寻址能力。 

 

 一般在我们眼里64位系统比32位系统快,但是为什么快呢?64>32,这是表面看到最实际的东西而得到的结论,但是这个结论没什么用,本质没有弄清楚。

       计算机中数据或者程序都是以机器码形式(0/1)被系统处理,而机器码由汇编得到,那么我们可以从汇编的角度来看看64位为什么比32位快?

       我们知道32位系统里寄存器个数为8个,函数的形参都是存储在栈里面(内存),且函数内的局部变量如果太多的话也会存入栈中。而64位系统含有16个寄存器,比32位系统多了8个,它的函数形参是放在寄存器中,形参个数超过6个则放在栈中,而寄存器的访问速度比内存要快,所以从函数形参的存储可以的知64位要比32位要快。
 

第三,运算速度不同。64位CPU GPRs(General-Purpose Registers,通用寄存器)的数据宽度为64位,64位指令集可以运行64位数据指令,也就是说处理器一次可提取64位数据(只要两个指令,一次提取8个字节的数据),比32位(需要四个指令,一次提取4个字节的数据)提高了一倍,理论上性能会相应提升1倍

第四,寻址能力不同。64位处理器的优势还体现在系统对内存的控制上。由于地址使用的是特殊的整数,因此一个ALU(算术逻辑运算器)和寄存器可以处理更大的整数,也就是更大的地址。比如,Windows Vista x64 Edition支持多达128 GB的内存和多达16 TB的虚拟内存,而32位CPU和操作系统最大只可支持4G内存。

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读