一次让人记忆深刻的No implementation found for问题排查记录

webrtc里面的Java的jni方法的实现和传统的开发流程不一致,你按照webrtc规定的语法编写对应接口,webrtc自带的模块会自动帮你生产一堆的接口代码,减少很多无谓的重复劳动

这次我们在webrtc的c++层增加了一个native 方法给Java层调用,so和aar生成之后,就“随便”在Java层的某个地方调用了(这就是坑的所在),结果就是No implementation found for新增的这个jni方法了

排查记录

有没有按照webrtc的语法写了接口?

负责的同学看了一下,一开始确实没有把文件添加到build文件里面

webrtc有没有给我生成我想要的胶水代码?

在webrtc仓库下查找对应的文件(webrtc自动生成的),确实是有的(find -name "XXX_jni.h")

jni方法名是否一致?

确认XXX_jni.h的名字和No implementation found for 里面的名字是一致的

方法名是否有冲突?

修改jin方法名为一个不常用的名字,还是没有解决问题

aar是否包含正确的so?

把安装包里面的so和本地的so的md5对比,hash值是一样的,证明so是正确的

so里面是否包含对应的jni方法?

用strings方法查看No implementation found for的jni方法,确实是有的

so加载失败或者没有加载?

看了一下调用的地方,是在模块初始化的地方,我X,so根本还没有加载,只能为一开始自己的随意默默埋单,心里一万只🦙奔腾而过

反思

1. java确实不熟悉,排坑经验不足

2. 对测试行为没有保持足够的严谨性,测试点有两个,一个是调用新增的Java接口(这里在哪里调用都是OK的),一个调用jni方法(必须要so加载完成才能调用),第一个ok的地方,不代表第二个也是OK的,这里的警惕性和严谨性是不够的

3. webrtc本身的独特性增加了需要确认的流程,本身也是对webrtc配套不熟悉需要付出的学费

posted @ 2021-08-16 10:58  2BiTT  阅读(1956)  评论(0编辑  收藏  举报