android so库使用吗,Android SO库使用之坑

一、UnsatisfiedLinkError基本介绍

异常: java.lang.UnsatisfiedLinkError

原因:Throw if the java Virtural Machine cannot find an appropriate native-language definition of method declared native意思就是JVM找不到native method的native实现!

抛出这种异常,建议先去检查下库中的方法是否跟调用对应。如果没问题,再检查SO库的加载以及应用的调用流程即可定位问题。

二、Crash!java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file “/data/app/com.tencent.bugly.demo-1/base.apk”],nativeLibraryDirectories=[/vendor/lib, /systemb]]] couldn’t find “lib.so”

原因:apk安装时,系统会把apk中libs目录下armeabi的SO拷贝到应用的私有目录下。所以jnilibs里没有正确的放入SO,运行时肯定找不到SO。

请注意,arm64位手机,它会优先加载arm64-v8a库中的so文件,所以如果使用这个文件夹,比如让这里面提供的库齐全,否则在arm64的手机上就会报这个错。x86也是同理。

三、 Crash!java.lang.UnsatisfiedLinkError: dlopen failed:“/data/app/com.tencent.bugly.crashreport.demo-2/lib/arm/libBugly.so” has unexpected e_machine: 3

原因: apk安装时,系统把armeabi下的lib.so放入应用的私有目录中了!但这个lib.so不是arm的,而是x86编译的lib.so运行时,系统检察ELF文件中的e_machine字段的值,跟arm的不匹配,就会抛出这个异常了!

四、java.lang.UnsatisfiedLinkError:No implementation found for XXX

说是要建立跟c/cpp写的代码一样的包名和java文件,这种问题使用JnI根据java文件生成下.h文件重写一遍实现就好了。

以上几个问题都是SO库没有正常使用造成的,在使用SO库的时候需要注意以下三点;1.需要注意SO库的加载顺序;2.对每一种CUP架构都提供全面的SO库,避免出现某种CUP架构缺少对应SO库的情况,这种问题不好定位。3.不要把SO库放错文件夹出现不必要的问题。使用时只要仔细就能避免这些坑。

需要注意的问题

在使用NDK时,你可能会比较倾向于使用最新的编译平台,但事实上这是错误的,因为NDK平台不是后向兼容的,而是前向兼容。所以推荐使用app的minSdkVersion对应的编译平台

大神防坑

http://blog.csdn.net/qq_23331691/article/details/51699888

http://blog.csdn.net/ouyang_peng/article/details/51168072

http://www.jianshu.com/p/cb05698a1968

http://www.open-open.com/lib/view/open1465092707607.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值