今天安装baidumap.apk后,发现它的7.0甚至更高版本不能工作,打印信息如下:
I/DEBUG ( 2201): #00 pc 00071fe6 /data/app-lib/com.baidu.BaiduMap-1/libbd_etts.so (etts::MemPool_tts::Alloc1d(int, int, int)+93)
I/DEBUG ( 2201): #01 pc 000527c3 /data/app-lib/com.baidu.BaiduMap-1/libbd_etts.so
I/DEBUG ( 2201): #02 pc 00052a1b /data/app-lib/com.baidu.BaiduMap-1/libbd_etts.so (DataVersion_CheckMD5+34)
I/DEBUG ( 2201): #03 pc 0000175f /data/app-lib/com.baidu.BaiduMap-1/libbds.so(Java_com_baidu_speechsynthesizer_data_SpeechOfflineSynthesizer_bdTTSVerifyDataFile+28)
I/DEBUG ( 2201): #04 pc 0001e550 /system/lib/libdvm.so (dvmPlatformInvoke+112)
I/DEBUG ( 2201): #05 pc 0004d765 /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+392)
I/DEBUG ( 2201): #06 pc 00038e05 /system/lib/libdvm.so (dvmCheckCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+8)
I/DEBUG ( 2201): #07 pc 0004f957 /system/lib/libdvm.so (dvmResolveNativeMethod(unsigned int const*, JValue*, Method const*, Thread*)+174)
I/DEBUG ( 2201): #08 pc 00027960 /system/lib/libdvm.so
I/DEBUG ( 2201): #09 pc 0002b800 /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184)
I/DEBUG ( 2201): #10 pc 0005ffdd /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+272)
I/DEBUG ( 2201): #11 pc 00060007 /system/lib/libdvm.so (dvmCallMethod(Thread*, Method const*, Object*, JValue*, ...)+20)
I/DEBUG ( 2201): #12 pc 00054b7f /system/lib/libdvm.so
I/DEBUG ( 2201): #13 pc 0000e410 /system/lib/libc.so (__thread_entry+72)
I/DEBUG ( 2201): #14 pc 0000dae8 /system/lib/libc.so (pthread_create+216)
int tid = __pthread_clone((int(*)(void*))start_routine, tls, flags, arg);
dad4: e1a03008 mov r3, r8
dad8: e1a00009 mov r0, r9
dadc: e1a01004 mov r1, r4
dae0: e3a02c0f mov r2, #3840 ; 0xf00
dae4: e3402045 movt r2, #69 ; 0x45dae8: eb002973 bl 180bc <__pthread_clone>
通过进一步检查,以及反汇编I/DEBUG ( 2201): #00 pc 00071fe6 /data/app-lib/com.baidu.BaiduMap-1/libbd_etts.so
71fe6: eef8 2be7 vcvt.f64.s32 d18, s15
以上库的代码,发现问题的原因所在.vcvt.f64.s32 d18, s15 指令的作用:将s15中的有符号32位的整数转换为双精度64位的浮点数.但是我们的机器型号是: VFPv3-D16 FPU with trapless execution.它不能支持 百度地图里面的vcvt 指令.它需要VFPv3-D32 才能支持这条指令.所以此版本不支持.
解决过程中,需要注意的知识点再温习一下:[1] objdump / addr2lineDirectory: android/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/binarm-linux-androideabi-addr2line –e obj/local/armeabi/libhello-jni.so 00004de8 000056c8 00004fb4 00004f58arm-linux-androideabi-objdump –S obj/local/armeabi/libhello-jni.so > hello.asmreference document web:http://www.oschina.net/question/2241352_213433
[2] VFPARM 浮点架构 (VFP) 为半精度、单精度和双精度浮点运算中的浮点操作提供硬件支持。它完全符合 IEEE 754 标准,并提供完全软件库支持。reference document web:http://www.arm.com/zh/products/processors/technologies/vector-floating-point.php
[3] VCVT
VCVT(在单精度数和双精度数之间)
在单精度数和双精度数之间转换。
VCVT
始终为标量。语法
VCVT
{cond}.F64.F32 Dd,Sm
VCVT
{cond}.F32.F64 Sd,Dm
其中:
cond
是一个可选的条件代码(请参阅条件代码)。
Dd
是用于存放结果的双精度寄存器。
Sm
是用于存放操作数的单精度寄存器。
Sd
是用于存放结果的单精度寄存器。
Dm
是用于存放操作数的双精度寄存器。
用法
这些指令将
Sm
中的单精度值转换为双精度值,并将结果存放到Dd
中;或将Dm
中的双精度值转换为单精度值,并将结果存放到Sd
中。浮点异常
这些指令会产生无效运算、非标准输入、溢出、下溢或不精确异常。
referecence document web:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204ic/Bcffbdga.html
百度地图7.0版本不能工作
最新推荐文章于 2021-05-26 17:26:45 发布