上一节我们谈到so库是同通过Native语言开发的,自然在Android中使用so库的时候发生的Crash,就是我们所说的Native Crash。为了更好的让大家知道Native Crash是如何产生的,下面笔者举一个例子:
Java层定义Native方法

本地方法跟普通的Java方法的区别在于方法声明多了native关键字。
JNI层实现Native方法

这里我们制造一个Native Crash,空指针异常。
通过Java调用Native方法

要调用Native方法需要先加载我们开发好的so库,通过System.loadLibrary(“so名字”);来调用,然后在通过java调用声明的native方法。
Native Crash如何分析?
既然要分析就必须找到可以分析的东西,我们在分析Java层Crash的时候是通过logcat日志找到对应的出错代码,然而Native层Crash也是可以logcat日志来进行分析的。
这里我们截取上面制造的crash在logcat显示的日志:

这个是什么鬼,看不懂啊有木有。这个出错信息是我们调用native函数时打印出来的日志,只是简单的描述出错信号,出错地址还有进程号,看这个是完全摸不着调的。不过系统还是会提供相关有用的日志,我们在Android Studio查看logcat的时候需要做一下过滤。

在logcat添加完”DEBUG”的过滤项之后,我们就能得到以下log:

这下子可分析的内容就多起来了,我们逐个来看看:
- 进程信息:pid表示进程号,tid表示线程号,name表示进程名
- 错误信号:signal 11表示信号的数字,SIGSEGV表示信号的名字,code 1(SEGV_MAPERR)表示出错代码,fault addr 00000000 表示出错的地址。
- 寄存器快照:进程收到错误信号时保存下来的寄存器快照,一共有15个寄存器。
- 堆栈信息:##00表示栈顶,##01调用#00,以此往下都是嵌套的调用关系,直至到栈顶。
这里参考了:http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=27&extra=page%3D4
我们在栈顶就已经看到我们出错的地方了:
#00 pc 00000730 /data/app-lib/com.devilwwj.jnidemo-1/libJNIDemo.so (Java_com_devilwwj_jnidemo_TestJNI_createANativeCrash)
pc 00000730 表示出错的地址,后面可以看到我加载了libJNIDemo.so库,接着是我们前面声明的Native方法,通过这种方法我们就能准确的找到出错的地方。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。





既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

学习分享,共勉
Android高级架构师进阶之路
题外话,我在阿里工作多年,深知技术改革和创新的方向,Android开发以其美观、快速、高效、开放等优势迅速俘获人心,但很多Android兴趣爱好者所需的进阶学习资料确实不太系统,完整。今天我把我搜集和整理的这份学习资料分享给有需要的人
- Android进阶知识体系学习脑图

- Android进阶高级工程师学习全套手册

- 对标Android阿里P7,年薪50w+学习视频

- 大厂内部Android高频面试题,以及面试经历

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
…(img-0Zp83Cnp-1713713088362)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
本文详细介绍了Android中的NativeCrash现象,通过实例演示了Java层调用Native方法可能导致的空指针异常。作者展示了如何通过logcat日志分析,包括查看进程信息、错误信号、寄存器快照和堆栈跟踪,以定位出错的Native方法位置。

被折叠的 条评论
为什么被折叠?



