Android 的 libs文件夹下 armeabi 和 armeabi-v7a的差别,导致百度地图的定位不执行定位回调函数的问题
关于开发当中遇到的这个第二个问题,我表示已经到了麻木的状态,我指的是因为这个问题困扰了我至少两天的时间,当我发现了导致定位失败的原因过后,我已经麻木了,没有了解决问题的兴奋感~~~~~~~~~~~~~~
还是回到正文吧,我在开发一个涉及到定位的项目,当我单独写了定位的demo的时候,完全正常,心里想着,直接把这个代码块拖到工程里面就OK了(当然是为工程申请新的百度mapkey),两天之前我也确实是这样做的,但是完全没有达到我想要的效果,定位没有实现,地图倒是能够正常显示的,于是就开始了解决问题的探索,从mainfest.xml的配置开始检查起,什么服务有没有开启,权限有没有添加完全~~~~~~~~~但如你所知,这些都不是!中间找问题的过程太坑爹了,因为在原来的demo里面是完全能够正常运行的,但是拿过来就仅仅是换了个位置,为什么就不能够运行了呢,我实在找不到原因,各种论坛各种问,也还是没发现,就这样过了两天,今天下午在我准备吃饭打算晚上继续纠结的时候,终于仔细的看了一下logcat 这下子才发现了问题的线索,
以下是一部分被我一直忽略的异常打印:
原来定位的.so文件更本就没有load成功,怎么会执行定位的回调函数public class MyLocationListener implements BDLocationListener{~~~~~~~}呢???
但是为什么他没有执行呢? 各种配置也搞定了,而且服务也申明了???
那我只能看libs当中.so文件的存储位置了,结果我认真看了后发现,原来的demo工程的libs文件夹下面是这样子的:
意思只有一个armeabi子文件夹,然后所有的.so文件也是放到这个里面的,但是我又看了工程里面的libs文件夹下面是这样子的:
唯一的问题出错地方定位在了这里:.so文件放错了位置!!!! 和我的手机cpu不匹配,导致不能够读取到定位的.so文件,接下来说说armeabi 、armeabi-a7v、x86、mips
这个几个文件夹的关系和差别:转(http://blog.csdn.net/duqiuke/article/details/8183549)
ARM(Advanced RISC Machines)是微处理器行业的一家知名企业,设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软件。技术具有性能高、成本低和能耗省的特点。适用于多种领域,比如嵌入控制、消费/教育类多媒体、DSP和移动式应用等。
什么是EABI?
Embedded application binary interface, 即嵌入式应用二进制接口,是描述可连接目标代码,库目标代码,可执行文件影像,如何连接,执行和调试,以及目标代码生成过程,和c, c++语言接口的规范,是编译连接工具的基础规范,也是研究它们工作原理的基础,可惜arm的EABI迄今为止没有完全订好。作为EABI的组成部分有过程调用规范,可执行文件格式规范,c/c++ ABI规范和调试格式规范。 EABI ,说的是这样的一种新的系统调用方式
在我们android APK的根目录有一个 libs文件夹,此文件夹下包含了armeabi 和armeabi-v7a两个文件夹,我们的c代码编译成的本地库(各种.so)就会放在这两个文件夹其中的一个。那armeabi-v7a 与 armeabi有什么区别,都是什么意思呢?
armeabi和armeabi-v7a是表示cpu的类型,我们知道一般的手机或平板都是用arm的cpu(mips的就悲催的被忽视了),不同的cpu的特性不一样,armeabi就是针对普通的或旧的arm cpu,armeabi-v7a是针对有浮点运算或高级扩展功能的arm cpu。
在android.mk里可配置以下宏:
TARGET_CPU_API := armeabi
APP_ABI := armeabi
当你编译时出现一些链接动态库的undefine错误,或你的apk运行时出现装载.so动态库错误时,不妨看一下这个cpu类型的配置是否有误
这里也介绍了相关的信息:http://www.th7.cn/Program/Android/201304/134297.shtml
总之问题按照上面的方式解决了,纠结了两天的一个问题算是放下了!