百度地圖7.0版本不能工作
阿新 • • 發佈:2019-02-02
今天安裝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 / 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] VCVTVCVT(在單精度數和雙精度數之間)
在單精度數和雙精度數之間轉換。
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