百度地图7.0版本不能工作

今天安装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 ; 0x45
    dae8:       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 / addr2line  
Directory: android/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin
arm-linux-androideabi-addr2line –e obj/local/armeabi/libhello-jni.so 00004de8 000056c8 00004fb4 00004f58
arm-linux-androideabi-objdump –S obj/local/armeabi/libhello-jni.so > hello.asm
reference document web:
http://www.oschina.net/question/2241352_213433

[2] VFP 
ARM 浮点架构 (VFP) 为半精度、单精度和双精度浮点运算中的浮点操作提供硬件支持。它完全符合 IEEE 754 标准,并提供完全软件库支持。 

ARM VFP 的浮点功能为汽车动力系统、车身控制应用和图像应用(如打印中的缩放、转换和字体生成以及图形中的 3D 转换、FFT 和过滤)中使用的浮点运算提供增强的性能。下一代消费类产品(如 Internet 设备、机顶盒家庭网关)可直接从 ARM VFP 受益。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值