FeiGeChuanShu/ncnn-android-yolov8崩溃问题解决

最近在玩yolov8目标检测算法,clone飞哥的项目玩了下,过程真是蜿蜒曲折啊,先是我的小米手机不支持camera2 api,飞哥的项目用的camera2 的api,我先是用camera1来试着修改,但是由于camera1是nv21数据,不能直接调用飞哥写了api,我就用nv21转bitmap再转成opencv mat来操作最后通过imageView.setBitmap展示,发现性能太差了,然后就尝试将手机刷机然后修改属性支持了camera2,这样我想应该没问题了,结果发生了崩溃,然后进行崩溃分析解决,然后就有了这篇记录文章。

崩溃日志

2023-06-20 23:12:57.519 13400-13400 DEBUG                   pid-13400                            A  pid: 13317, tid: 13343, name: ImageReader-640  >>> com.wy.detect <<<
2023-06-20 23:12:57.552 13400-13400 DEBUG                   pid-13400                            A      #01 pc 000000000040b048  /data/app/com.wy.detect-F2gICGxjfcotWL4V39qrsw==/base.apk (offset 0x1992000)
2023-06-20 23:12:57.552 13400-13400 DEBUG                   pid-13400                            A      #02 pc 000000000040a228  /data/app/com.wy.detect-F2gICGxjfcotWL4V39qrsw==/base.apk (offset 0x1992000)
---------------------------- PROCESS ENDED (13317) for package com.wy.detect ----------------------------
2023-06-20 23:12:59.429   507-507   SurfaceFlinger          surfaceflinger                       E  Failed to find layer (SurfaceView - com.wy.detect/com.wy.detect.ThirdActivity#0) in layer parent (no-parent).
2023-06-20 23:12:59.429   507-507   SurfaceFlinger          surfaceflinger                       E  Failed to find layer (Background for - SurfaceView - com.wy.detect/com.wy.detect.ThirdActivity#0) in layer parent (no-parent).

分析了日志,感觉没有有用的信息,就一行代码一行代码的查了,然后发现了关键信息在void NdkCameraWindow::on_image方法中发现调用ANativeWindow的方法就崩溃,显然是surface还没有被赋值就被拉来用了,然后就可以愉快的解决了

解决

在ndkcamera.cpp文件的void NdkCameraWindow::on_image方法最前面添加以下代码,判断持有的ANativeWindow是否为空即可解决该崩溃问题。

 if(win == 0){
        __android_log_print(ANDROID_LOG_WARN,"NdkCameraWindow", "win is null");
        return;
    }
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐