android-记录一个UnsatisfiedLinkError的问题
JNI: 记录一个UnsatisfiedLinkError的问题
今天在使用下午build的一个so lib时,无意中报了下面的问题:
AndroidRuntime: FATAL EXCEPTION: Thread-4903
Process: com.hxct.home, PID: 24487
java.lang.UnsatisfiedLinkError: No implementation found for void com.gqt.codecs.AmrNB.close() (tried Java_com_gqt_codecs_AmrNB_close and Java_com_gqt_codecs_AmrNB_close__)
at com.gqt.codecs.AmrNB.close(Native Method)
at com.gqt.media.RtpStreamSender_group.run(RtpStreamSender_group.java:978)
看 log 说的是:
java.lang.UnsatisfiedLinkError: No implementation found for ...
其实这个错误之前也遇到过,根据以往的经验,这大概是说 java 端的 native 方法找不到对应的jni方法,一般情况下要么是生成的jni函数的签名与 java端native 不匹配(通常是包名不匹配),要么是 so 库还没有加载导致的,可仔细检查了下我的native方法签名与 jni函数签名是匹配的呀,我从来都是使用android studio 自动生成 jni 函数签名的,基本不大可能出错,而且按住Ctrl键点击方法名也能跳转到对应的C/Java方法 。
那到底是什么原因导致的呢?
折腾了大概快1个小时,该用的招数都用尽了,跑起来还是报这个错误,突然想到有没有可能是编译缓存导致的?
就是这个 .cxx 目录,我发现执行 Gradle clean
的时候,build
目前是可以清理掉的,但是这个 .cxx目录却没有删掉,会不会是它导致的?于是手动把build
目录,.gradle
目录,.cxx
目录都给删掉,然后再编译 so 库。
出人意外的是,这次居然可以了,看来往jni层添加新的code,编译新的 so 时,最好还是需要把这个 .cxx目录删掉才行。