使用android studio进行ndk开发时如何定位crash崩溃错误
在ndk开发时, jni层的代码一旦出现问题, 就会打印如下信息, 然后直接闪退, 这时候让人非常抓狂, 只能过在各个jni函数中打印日志来跟踪问题,但是效率实在是太低,碰到有多线程的时候很难定位到问题.
网上搜索到的定位ndk崩溃的文章都是使用eclipse来举例的, 编译时产生的so文件保存在obj/local/armeabi/目录下, 但是使用android studio进行开发的话根本没有obj/local/armeabi/这个目录.
因此本篇文章就来介绍下如何在android studio下来定位ndk崩溃
想要准确定位崩溃代码的地址的话我们就需要用到ndk工具包里的adrr2line这个工具了
/home/gavinandre/Documents/Android/android-sdk-linux/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-addr2line
在该目录下做个软链接后就能在任何目录使用这个命令了
sudo ln -s arm-linux-androideabi-addr2line /usr/local/bin/addr2line
$ find -name "libsocket_camera-lib.so"
./build/intermediates/bundles/debug/jni/armeabi-v7a/libsocket_camera-lib.so
./build/intermediates/bundles/default/jni/armeabi-v7a/libsocket_camera-lib.so
./build/intermediates/cmake/release/obj/armeabi-v7a/libsocket_camera-lib.so
./build/intermediates/cmake/debug/obj/armeabi-v7a/libsocket_camera-lib.so
./build/intermediates/transforms/mergeJniLibs/release/folders/2000/3/main/lib/armeabi-v7a/libsocket_camera-lib.so
./build/intermediates/transforms/mergeJniLibs/debug/folders/2000/3/main/lib/armeabi-v7a/libsocket_camera-lib.so
./build/intermediates/transforms/stripDebugSymbol/release/folders/2000/3/main/lib/armeabi-v7a/libsocket_camera-lib.so
./build/intermediates/transforms/stripDebugSymbol/debug/folders/2000/3/main/lib/armeabi-v7a/libsocket_camera-lib.so
可以看到android studio编译后生成了许多so文件, 以我的经验正确的so文件一般是这个文件:build/intermediates/transforms/mergeJniLibs/release/folders/2000/3/main/lib/armeabi-v7a/libsocket_camera-lib.so
然后就可以使用addrline命令了, 格式是addr2line -e 文件位置 崩溃地址(红框3: 00013122)
addr2line -e build/intermediates/transforms/mergeJniLibs/release/folders/2000/3/main/lib/armeabi-v7a/libsocket_camera-lib.so 00013122
如果so文件正确的话会打印如下信息,socket_camera.cpp就是崩溃的cpp文件, 304就是行数, 然后检查下定位出来的位置是否在DEBUG信息里给出的函数里(红框4)
/home/gavinandre/Documents/Workspace/AndroidStudioProject/DisinfectionRobot/nvadtslibrary/src/main/cpp/nvadts/video_engine.cpp:304
如果so文件错误的话会打印问号或者一个不对的位置, 这时就要换so文件多尝试了
??:?