最近在做一个项目用到了百度地图的定位、地理编码检索以及导航。由于官方使用的是Eclipse,我用的是AS(Android Studio),然后遇到了蛮多的坑。感觉As就是后娘养的,百度地图对AS的支持真的是不给力。言归正传,说回来问题:
在app上出现了“百度导航引擎初始化失败”,log里报错:
library "libgnustl_shared.so" not found</span>
dlopen("/data/app-lib/~~~~~/libgnustl_shared.so") failed</span>
1、从log可知,是缺少了libgnustl_shared.so文件,所以首先检查你是否把百度导航的*.so 文件和*.jar文件导进相应的位置。百度地图一般是把*.jar文件导进Libs文件夹中,然后*.so文件放进main/JniLibs文件当中。但是AS不能够自动加载库,还需要手动添加。从DDMS中查看App下的data/data/app名/..../lib/下有没有那个.so文件,如果没有就说明没有加载进来(但是由于我的机子没有root,所以无法进去看一下,我用的是魅蓝2机子,官方的模拟器太卡,是在受不了,Genymotion无法运行百度地图,Genymotion模拟器的CPU是x86框架的,so文件不能在x86上运行,但是也有一个ARM插件,让Genymotion也能运行arm类的app,但是我安装失败了,索性就在真机上测试)。
然后,还需要在上面那个build.gradle中,添加这个一句话,官方是这么说的:
可是,在这我又遇到了坑,我只要一添加这个ourceSet就会报警,程序崩溃掉。屏蔽掉就能不报警不崩溃。是在是无语。就算我直接从官方demo中拷过来,依旧会遇到这个问题。纠结了蛮久的。索性把它屏蔽了,然后能运行,没有问题····················
2、有没有把assets下的那几个文件放到工程里。不要天真的以为那两个png文件真的是图片,那也是资源,不过被强行打包成png格式而已。
3、框架问题,百度地图好像不支持X86平台的。
4、库冲突。我就是掉进了这个坑里的。卡在了这个问题大半天,都无法找到问题,晚上睡觉的时候垫高了枕头想到了一两个方法,一是把现在的工程转移到能正常运行的官方demo中,二是转用Eclipse。在转移工程的时,我把百度地图基本地图和定位的库移到官方demo。然后运行,发现,没有加进其他库的之前,导航能够正常运行,但是添加之后,就提醒“百度导航引擎初始化失败”。Binggo!妥妥的是库冲突了。
首先,官方demo中只有一个armeabi文件夹,说明了,在官方demo中,这个库是正常的,那么我逐个移除其他的库,这个时候体现了我人品,第一个移除arm64-v8a后,官方demo又能正常运行了!回到我的工程里,把这个库文件删了,我的天呐~!
导航就正常了,心花怒放啊~~~~
在这里,我巧借了官方的小demo,排除了其他模块的干扰,锁定了问题所在。那几个文件本来就是为了兼容不同的机子的,但是问题却出现在这里面了。真是醉了。机子不同,可能要删除的文件也不一样,所以遇到了这问题的朋友,多试几下。