UnsatisfiedLinkError:No implementation found for long com.xxx.NativeWrapper.nativeinitxx(int)

项目需要引入三方sdk,sdk是以aar的形式引入的,集成到项目中后,运行apk,报异常

UnsatisfiedLinkError:No implementation found for long com.xxx.NativeWrapper.nativeinitxx(int)

原因: so库重名导致
开发中遇到这个错误,网上搜索无用。起因:引用三方aar包,编译apk,运行时报此异常。最后发现是引用的三方aar包在打包成apk后,apk中aar里面的的so库和本地编译生成的so库重复导致(名称都叫native_lib.so)。修改本地mk文件(使用c++,c代码编译,打包apk后生成的so库,mk文件控制的)中的LOCAL_MODULE的值后解决(LOCAL_MODULE的值即为编译apk后生成的so库)
所以大家在平时开发过程中一定要养成良好的习惯,命名规范,像native_lib这种名字,很普遍,很容易有命名冲突,如果使用的两个三方的so库命名冲突的话,就不好解决了。对开发so库的人来说只是习惯问题,但如果一旦用到项目中,可能光找到问题的原因就要好久,很耗费时间。
查找问题历程:
运行官方demo没有问题,将aar放到自己写的demo也没有问题。故肯定是项目中的配置引起的。考虑到项目gradle配置较多,且有签名,so库,jar包依赖,因素太多无法直接查找问题所在,于是将项目中的build.gradle中的配置一点一点复制到自己写的demo中,边copy边编译运行。考虑到异常是jni相关的,故看到项目中

externalNativeBuild {
  ndkBuild{ path "src/main/jni/Android.mk"}
.....
    }

这一块代码时,格外关注,发现注释掉这一部分就没问题,于是查看Android.mk中的内容,刚开始跑偏了,一直试图将aar的引用写在Android.mk文件中解决问题,最后一个同事问,apk中有aar的库吗,思考了一下,于是查看官方demo中的apk中的so库,又看了项目中没有引入aar之前的so库,找到了问题所在,更改mk文件中的LOCAL_MODULE后,问题得到解决。
以下是小编常用的adb bat命令,方便直接在电脑上点击bat文件即可

cmd中查看 tag的日志
cmd_adb.bat

adb logcat -c
adb logcat -b all -v time -s Test

日志保存到本地后,用Notepad++打开,提前新建好D:/log/adb_save_log.log文件
adb_save_log.bat

adb logcat -v time -d -b main > D:/log/adb_save_log.log
start /d "C:\Program Files\Notepad++" notepad++.exe "D:/log/adb_save_log.log"

adb_log.bat

adb logcat -c
adb logcat -v time process thread > D:/log/adb_log.log
start /d "C:\Program Files\Notepad++" notepad++.exe "D:/log/adb_log.log"

你可能感兴趣的:(android,android)