- 点击跳转=>Unity3D特效百例
- 点击跳转=>案例项目实战源码
- 点击跳转=>游戏脚本-辅助自动化
- 点击跳转=>Android控件全解手册
- 点击跳转=>Scratch编程案例
- 点击跳转=>软考全系列
👉关于作者
专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)
有什么需要欢迎底部卡片私我,交流让学习不再孤单。
👉实践过程
😜问题
之前开发的 SO 一直很正常,最近一段时间有新业务要在原来SO 上开发,并且有了新的设计逻辑,也是新的同事去写了。所以公司准备 SO 重写一下。部分业务还是仿照或复制原来的代码,但是给到 Android 后一直崩溃,而且看 JNI 中同事写的日志最终停止点不固定。
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), ......
Cause: null pointer dereference
r0 00000000 r1 e4a9b9dc r2 0000ffff r3 bf1acf00
r4 bf1acf00 r5 bd10da00 r6 bd10da20 r7 00000004
r8 bda55fe0 r9 00000000 r10 bd10dbcc r11 bbdc3858
ip e4dfdfe4 sp bbdc3698 lr e4dfcd83 pc bee6ec34
backtrace:
#00 pc 00011c34 /data/app/com.raypai.splitassist-dqx6PtGtLxCC3HigSgunAA==/lib/arm/libusb100.so
#01 pc 0000d200 /data/app/com.raypai.splitassist-dqx6PtGtLxCC3HigSgunAA==/lib/arm/libusb100.so
#02 pc 0000cb60 /data/app/com.raypai.splitassist-dqx6PtGtLxCC3HigSgunAA==/lib/arm/libusb100.so (libusb_handle_events_timeout_completed+968)
#03 pc 0000d3cc /data/app/com.raypai.splitassist-dqx6PtGtLxCC3HigSgunAA==/lib/arm/libusb100.so (libusb_handle_events+52)
#04 pc 00012c20 /data/app/com.raypai.splitassist-dqx6PtGtLxCC3HigSgunAA==/lib/arm/libuvc.so (_uvc_handle_events+136)
#05 pc 00065ac7 /system/lib/libc.so (__pthread_start(void*)+22)
#06 pc 0001e9ad /system/lib/libc.so (__start_thread+32)
在此咱们不讲如何具体定位 JNI 崩溃定位,改日再出一篇文章介绍。
😜解决
出现问题的原因在于没有进行Handler调用JNI的方法。尤其是线程协程中。
利用 Android Studio 创建个 C++ 的 JNI 项目,你会发现会有个 native-lib 的文件,当你有其他业务的时候会写在自己创建的 C++ 文件中。
原来的 SO 业务全部写在这个 native-lib 文件中,Android 层调用的时候发现无论是默认调用还是线程调用都没问题,但是如果你调用了其他 C++ 文件里的方法,在 Android 层中就没法在线程协程中调用,而且还不会报出具体错误。定位错误成本高。需要借住 Handler 调用 JNI 中的方法。暂时没时间去深究,如有大佬知道感谢留言。
无脑的解决方式是只要是 JNI 方法,都用 Handler 去调用。
注意:此类错误不是上面的唯一原因。还有其他问题也会导致此相似问题。
- JNI 中空指针问题。
- JNI 是 C++ 开发的,而 C++ 需要自己管理释放销毁,所以靠谱的 C++ 同事很重要。
👉其他
📢作者:小空和小芝中的小空
📢转载说明-务必注明来源:https://zhima.blog.csdn.net/
📢这位道友请留步☁️,我观你气度不凡,谈吐间隐隐有王者霸气💚,日后定有一番大作为📝!!!旁边有点赞👍收藏🌟今日传你,点了吧,未来你成功☀️,我分文不取,若不成功⚡️,也好回来找我。
温馨提示:点击下方卡片获取更多意想不到的资源。