- 上面的crash问题都是在jni层c++代码中出现的,根据log的提示
F/libc ( 5580): Fatal signal 11 (SIGSEGV) at 0x0004811a (code=1), thread 5593 (Cursor server e)
Fatal signal 11 (SIGSEGV):这个signal 11 明确指示该问题是由空指针引起的。出现这个signal 11 的log我们就可以确定其是由空指针引起,我们不要往其它方面想,从空指针的方向去找就可以了。
- 至于具体是在什么地方有空指针,可以根据backtrace来判断,log中记录的backtrace如下:
I/DEBUG ( 136): backtrace:
I/DEBUG ( 136): #00 pc 0000916c /data/app-lib/com.orbbec.handgestureregdemo-2/libinteraction.so (jni_getDepthFromColor(_JNIEnv*, _jobject*, int, int, _jobject*)+256)
I/DEBUG ( 136): #01 pc 0001dbcc /system/lib/libdvm.so (dvmPlatformInvoke+112)
I/DEBUG ( 136): #02 pc 0004e133 /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+398)
I/DEBUG ( 136): #03 pc 00000214 /dev/ashmem/dalvik-jit-code-cache (deleted)
根据以上的log可以明确看出来,引用空指针的地方在jni_getDepthFromColor。
- 解决方法:找到出现空指针访问的函数之后,在空指针访问之前对指针进行保护,保护之后,如果不影响业务,就算解决完成了。
- 如果空指针所在函数比较大,可以进一步分析,从而定位出空指针访问出现在那一行代码。这个时候就需要两个工具来完成分析,一个是arm-linux-androideabi-addr2line.exe,另外一个是aarch64-linux-android-objdump.exe。工具一般在NDK的D:\android-ndk-r16b\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64\bin目录下。
要使用addr2line的工具,必须要编译Debug版本的app,并且需要引用带符号表的so库,编译方法可以参考:https://blog.csdn.net/a87b01c14/article/details/41480931。
Addr2line的使用方法可以参考:https://blog.csdn.net/toyauko/article/details/82416429。