本人一直用真机调试极光推送,一直没问题,今天准备在模拟器上运行项目看看,刚运行就爆掉了,感觉有些奇怪,遂查日志:

Android项目中使用激光推送时在模拟器上运行时报Fatal signal 11的解决_第1张图片

呵呵,致命错误:Fatal signal 11 (SIGSEGV) at 0x00070016 (code=1), thread 1417 (Thread-110)

                Fatal signal 11 (SIGSEGV) at 0x00000048 (code=1), thread 1422 (com.xxx)

网上一搜,千奇百怪的答案都有,有说多线程的影响的,要加同步锁保证异步线程争抢资源的问题等等。本人差点想全部写这块的代码,但是仔细一想,才加载app就报的问题,怎么会与多线程有关呢?于是再查看日志,问题来了,两处报的致命错误都是在 ../libjpush.so 处,于是想到了和推送有关,再进一步的一想,推送在主页就是一个实例化的一句话 JPushInterface.init(this); // 初始化 JPush ,这没什么东西啊,毕竟内部的实例化也是极光自己写好的,没理由错。

     为了继续能测试,此时引出了第一个解决方案,注释掉这句话,哈哈,这样问题就解决了,没有报错了。读者到这里了不要开心,问题根本没有解决,这只是权宜之计。

     此时我就将问题发到极光官网,对方的回答是将lib下的../libjpush.so换成 X86下的 ../libjpush.so,地址:http://docs.jpush.cn/display/dev/Android,打开地址看见了X86SDK,毫不犹豫的下载后,进入lib目录找到文件并将其替换,然后运行看看,Ok,在模拟器上可以运行了,大功告成。

     天有不测风云,我立即在真机上试试,切,真机上报错了,看来是鱼与熊掌不可得兼啊,看图:

Android项目中使用激光推送时在模拟器上运行时报Fatal signal 11的解决_第2张图片

这个错误说明我们在初始化极光的时候没找到匹配的资源,也就是我们刚刚替换的那个只能解决模拟器的上的问题,而不能解决真机上的问题;于是我继续追问,过2小时左右得到回复:

请不要替换,libs目录是可以建多个文件夹的,名字也有规定,你现在需要两个文件夹,一个名字叫x86,一个是armeabi文件夹。他们里面都有一个libjpush.so,这两个文件是不一样的。

   于是按照其方法做了,最终彻底解决该问题。

   回头想想,也行在上一步的时候就可以把问题解决了,只是我理解上的偏差,多出了新的错误,所以很多事我们只有做了才知道里边真正的原理。

   总结:在开发中,如果我们的项目用了激光推送,只要保证libs下有x86文件夹和armeabi文件夹且各自有自己的libjpush.so文件,就不会出现任何问题了。