android-记录一个UnsatisfiedLinkError的问题

发布时间 2023-05-05 14:14:22作者: 夜行过客

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个小时,该用的招数都用尽了,跑起来还是报这个错误,突然想到有没有可能是编译缓存导致的?

image-20230505140455144

就是这个 .cxx 目录,我发现执行 Gradle clean的时候,build目前是可以清理掉的,但是这个 .cxx目录却没有删掉,会不会是它导致的?于是手动把build目录,.gradle目录,.cxx目录都给删掉,然后再编译 so 库。

出人意外的是,这次居然可以了,看来往jni层添加新的code,编译新的 so 时,最好还是需要把这个 .cxx目录删掉才行。