运行时崩溃找不到so包

最近在把Bing提供语音识别服务集成到自己的应用中来时遇到了一些问题:

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file “/data/app/com.holobor.voicedemo-2/base.apk”],nativeLibraryDirectories=[/data/app/com.holobor.voicedemo-2/lib/arm64,/data/app/com.holobor.voicedemo-2/base.apk!/lib/arm64-v8a,/vendor/lib64,/system/lib64]]] couldn’t find “libandroid_platform.so” at …

在这个里面发现一个关键词:arm64-v8a,当然,我没有在libs文件夹下面创建这个文件夹,因为Bing官方SDK中并没有给出相应的so包。

库文件目录的组织和官方给定的完全一致,不仅如此,当重新创建一个Project,新建Library与Module,完全按照现在的方式竟然是可以正常运行的,所以现在出错的原因就在于这两种方式的差异。
差异就是新建的工程里面只有Bing语音识别,而当前的工程中则包含一些其他的语音识别,其中也加了有so文件。


在网上查找解决方案的时候也发现了很多人都遇到了这个问题,但是给出的解决方案基本上是以下2种:
1.保证每个库文件夹下面的so文件完全一致,要有都有,否则都没有;
2.只保留armeabi文件夹即可,其他的可以不要,因为即使是64位的处理器也可以运行32位的库,带来的后果是损失效率(总比程序崩溃要好);

以上2种方法对于我的工程还是不行,这个时候我就想到了或许应该看一下我生成的apk文件中的库文件夹是怎样的:

在这里插入图片描述

没错,比我工程中多了几个文件夹,我想这就是问题的所在,根据查找顺序,64位处理器会优先查找arm64-v8a,里面如果没有相应的so文件就会报错。

多出来的文件夹是由于我还用了另外一个语音识别引擎Nuance,这种不是通过直接将so库文件拷贝到工程中,而是配置gradle,自动远程下载下来生成的


解决方案:
毕竟Nuance自动生成的库文件夹中没有我们所需的so文件,所以按照上面的逻辑,就应该是阻止自动生成我们不需要的文件夹或者下载相关的so文件放到对应的文件夹下面。

鉴于实际情况,因此解决方案如下:
在Module(注意不是Library)的build.gradle文件中添加如下内容:

defaultConfig {
    ...
    ndk {
        abiFilters 'armeabi','x86'//,'armeabi-v7a','x86_64','arm64-v8a',mips,mips64...加入需要生成的文件夹
    }
}

这样一来,生成的apk文件的libs文件夹中就只有我们需要的指定的文件夹了,当然也不会报找不到文件的错误了。

在这里插入图片描述

相关文章

AdvserView.java package com.earen.viewflipper; import an...
ImageView的scaleType的属性有好几种,分别是matrix(默认)...
文章浏览阅读8.8k次,点赞9次,收藏20次。本文操作环境:win1...
文章浏览阅读1.2w次,点赞15次,收藏69次。实现目的:由main...
文章浏览阅读3.8w次。前言:最近在找Android上的全局代理软件...
文章浏览阅读2.5w次,点赞17次,收藏6次。创建项目后,运行项...