一次让人记忆深刻的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配套不熟悉需要付出的学费