在JNI调用中经常会遇到异常导致APK闪退的现象,而这种问题通常很难定位,要定位这种问题,需要:
1:首先在logcat中加入debug(方法如图所示):
2:在运行后报错中会在debug中找到类似这样的一串错误
看到这个长长的错误,不要慌,我们就要拿着这个错误去分析:
首先,从这个长长的串中找到有用的信息
10-28 12:39:17.779: I/DEBUG(7749): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad
10-28 12:39:17.779: I/DEBUG(7749): r0 00000027 r1 deadbaad r2 a0000000 r3 00000000
10-28 12:39:17.779: I/DEBUG(7749): r4 00000001 r5 00000000 r6 44bc8c10 r7 44984e64
10-28 12:39:17.779: I/DEBUG(7749): r8 44bc8b70 r9 44984e54 10 44984e3c fp 800a5368
10-28 12:39:17.779: I/DEBUG(7749): ip afd46668 sp 44bc8ae0 lr afd191d9 pc afd15ca4 cpsr 60000030
10-28 12:39:17.779: I/DEBUG(7749): d0 646f423262287964 d1 6f42796f72747365
10-28 12:39:17.779: I/DEBUG(7749): d2 646e412f65737062 d3 6850656e69676e32
10-28 12:39:17.779: I/DEBUG(7749): d4 786f427363697379 d5 736e657478454432
10-28 12:39:17.779: I/DEBUG(7749): d6 2f696e6a2f6e6f69 d7 79442f4432786f42
10-28 12:39:17.779: I/DEBUG(7749): d8 42ce94f34e6e6b28 d9 3c8888893c888888
10-28 12:39:17.779: I/DEBUG(7749): d10 c26f7c303f800000 d11 3fed9bafc26f7e0e
10-28 12:39:17.779: I/DEBUG(7749): d12 0000000000000000 d13 0000000000000000
10-28 12:39:17.779: I/DEBUG(7749): d14 0000000000000000 d15 0000000000000000
10-28 12:39:17.779: I/DEBUG(7749): d16 3ef18d523ae9735c d17 3fca68bfcfa2d635
10-28 12:39:17.779: I/DEBUG(7749): d18 bf29fd09783e4216 d19 3ec6cd878c3b46a7
10-28 12:39:17.779: I/DEBUG(7749): d20 3f826164f3f641b5 d21 3f5e8ec8e86d933e
10-28 12:39:17.779: I/DEBUG(7749): d22 3e3782e7e0000000 d23 3e33401660000000
10-28 12:39:17.779: I/DEBUG(7749): d24 3fca99a880000000 d25 bfca99a880000000
10-28 12:39:17.779: I/DEBUG(7749): d26 be3ff77520000000 d27 3ef99342e0ee5069
10-28 12:39:17.779: I/DEBUG(7749): d28 bfa2b4442c6a6c2f d29 0000000000000000
10-28 12:39:17.779: I/DEBUG(7749): d30 0000000000000000 d31 0000000000000000
10-28 12:39:17.779: I/DEBUG(7749): scr 80000012
10-28 12:39:17.829: I/DEBUG(7749): #00 pc 00015ca4 /system/lib/libc.so
10-28 12:39:17.829: I/DEBUG(7749): #01 pc 0001c92c /system/lib/libc
3.用addr2line命令找到地址对应的程序位置,动态库为libmultiplayerservice.so
arm-eabi-addr2line 000078e6 -e libmultiplayerservice.so
结果:,显示出对应的程序文件和行数,如果不是debug版本,可能有一两行偏差