关于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内存。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SWT是一个跨平台的Java GUI,它提供了用于构建本地界面的组件和工具。SWT32位64位两个版本供开发者下载使用。 首先,32位64位是指计算机处理器的数据位数。32位处理器每次能够处理32位(4字节)的数据,而64位处理器每次能够处理64位(8字节)的数据。所以,64位处理器的处理能力更高,能够更快地处理大量数据和执行更复杂的运算。 当我们使用SWT进行开发时,选择32位还是64位取决于我们所使用的Java虚拟机(JVM)的位数。如果我们的JVM是32位的,就需要下载和使用32位的SWT;而如果我们的JVM是64位的,就需要下载和使用64位的SWT。 下载SWT的方法很简单,我们可以访问SWT的官方网站,从下载页面找到相应的32位64位版本的文件。通常,这些文件以jar或zip格式提供。我们可以根据自己的开发环境和需求选择下载对应的文件。 下载完文件后,我们需要将其导入我们的项目中。具体的导入步骤可以根据我们使用的集成开发环境(IDE)来进行设置,通常包括将文件添加到项目的构建路径中或将其放入项目的相应文件夹中。 总结来说,选择32位还是64位的SWT取决于我们所使用的Java虚拟机的位数。我们可以从SWT的官方网站下载对应的文件,并根据开发环境的要求将其导入到我们的项目中。这样就可以开始使用SWT进行GUI界面的开发了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值