在Android虚拟机中转换uint64为double时触发SIGILL错误的原因咨询
在Android虚拟机中转换uint64为double时触发SIGILL错误的原因咨询
嘿,我来帮你捋捋这个问题哈!
首先,SIGILL错误说白了就是程序执行了当前CPU不认识的非法指令,这大概率是Android虚拟机(AVD)和实体机的指令集支持差异导致的。
你用的Jolt Physics里触发错误的代码是这行:
// In Math.h /// Representations of true and false for boolean operations inline static const double cTrue = BitCast<double>(~uint64(0));
它的作用是把全1的64位无符号整数直接通过位转换变成double类型。这种操作在实体ARM64设备上是原生硬件支持的,但AVD毕竟是模拟出来的环境,问题可能出在这几个地方:
- 指令集模拟不兼容:如果你的实体机是ARM架构,但AVD选了x86/x86_64架构,或者你选的ARM架构AVD没有完全模拟实体机的全部指令集,这种底层位转换的指令就可能被虚拟机判定为非法指令,直接触发崩溃。
- AVD配置缺失:创建AVD的时候,你可能没开启对某些高级指令集的支持,虚拟机的模拟层没法正确处理这种类型的位转换操作——实体机是原生硬件支持,自然不会有这种问题。
- 编译选项不匹配:你编译Android版本时,可能默认用了适配实体ARM设备的编译选项(比如开启了ARM特有的优化),但虚拟机如果是其他架构,或者没对应上编译时的指令集要求,生成的代码在虚拟机里就跑不通。
你可以先试试换一个和实体机同架构的AVD,或者检查下AVD的CPU配置里有没有开启所有必要的指令集支持,再看看编译选项是不是和AVD的架构匹配,应该能快速定位到问题~
备注:内容来源于stack exchange,提问作者Zebrafish
相关产品推荐
相关产品推荐

