1. 程式人生 > >百度地圖7.0版本不能工作

百度地圖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