【Android】导入第三方库时,关于so文件的一些思考

来源:互联网 发布:mac手机铃声 编辑:程序博客网 时间:2024/05/29 04:00

测试手机:红米note3 
手机abi:arm64-v8a

首先问题的起源于异常如下:

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/xxx.xxxxx.xxx/base.apk"],nativeLibraryDirectories=[/data/app/xxx.xxxxx.xxx/lib/arm64, /vendor/lib64, /system/lib64]]] couldn't find "libxxxx_4_1.so"        at java.lang.Runtime.loadLibrary(Runtime.java:366)        at java.lang.System.loadLibrary(System.java:989)        at com.baidu.mapapi.BMapManager.<clinit>(Unknown Source)        at xxx.xxxxx.xxx.XxxxApplication.initEngineManager(XxxxApplication.java:195)        at xxx.xxxxx.xxx.XxxxApplication.onCreate(XxxxApplication.java:105)        at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1016)        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4797)        at android.app.ActivityThread.access$1500(ActivityThread.java:176)        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1498)        at android.os.Handler.dispatchMessage(Handler.java:111)        at android.os.Looper.loop(Looper.java:194)        at android.app.ActivityThread.main(ActivityThread.java:5578)        at java.lang.reflect.Method.invoke(Native Method)        at java.lang.reflect.Method.invoke(Method.java:372)        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:955)        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:750)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

在此之前,库的目录(so部分)如下: 
库的目录(so部分) 
出现问题的原因是 在上图的arm64-v8a中没有找到libxxxx_4_1.so。不过实际,也真的没有这个文件,第三方都未提供64位的版本,而针对库的支持有如下规则(如有纰漏,欢迎评论指正):

64手机支持32库、64库 
32手机支持32库

即理论上仅提供32位的库,就可以满足支持。所以我试着将目录arm64-v8a删除,但是之后运行,错误依旧在。

好,我就来看看这个错误。这个异常很明显是说,系统试图从nativeLibraryDirectories中加载指定的so文件,但没找到。我原先的想法,如果arm64-v8a中找不到,系统应该到armeabi中去找,毕竟armeabi是个缺省的so目录。但实际结果貌似不会去armeabi中查到。

但是奇怪的是,删除arm64-v8a目录之后,运行也出错。按照简单理解,arm64-v8a目录已经没有了,应该不会在从arm64目录中找so才是。除非,系统根据手机abi指定目录加载,然而实际不是。

至此要感谢合作方(@范淋)的帮助找到了这个资源,system-loadlibrary-couldnt-find-native-library-in-my-case,主要信息如下图: 
system-loadlibrary-couldnt-find-native-library-in-my-case 
他的说法中有建议直接打开(解压缩的形式)生成的apk文件,查看是否有”不合理”的目录存在。在我的情况中的确看到了arm64-v8a目录。目录中有一个其他第三方的so文件,最后问题由于依赖项目有个arm64-v8a目录,所以如果要移除某个类目,一定要删干净。

从原则来讲,只要提供armeabi和armeabi-v7a 就可以满足兼容支持,但是如果能提供完整的64位版本,可以更好的利用该架构的芯片,得到更高性能。


原文地址:http://blog.csdn.net/u011511368/article/details/51451121

0 0
原创粉丝点击