Android 工程/APK找不到 so 文件怎么办?

问题表象

通过日志查看表象:

在升级到SDK3.x(或4.x)之后出现了找不到so的问题 该问题的表象(日志关键字 )类似:

couldn't find "libgdinamapv4sdk752.so com.autonavi.amap.mapcore.MapCore.newInstance com.amap.api.maps.MapView.onCreate

通过解压APK查看表象:

除了通过日志,还可以通过一个简单的方式查看,是不是存在这个问题。

1)找到出问题的APK,如demo.apk。

2)修改后缀为demo.zip。

3)解压zip。

4)查看libs目录。

如果里面有处理armeabi以外的文件夹,那么就有可能有问题。例如下面这种就是有问题的:

问题分类

工程中缺少so文件

java.lang.UnsatisfiedLinkError:dalvik.system.PathClassLoader[DexPathList[[zip file"/data/app/com.example.projectforbbs-2/base.apk"],nativeLibraryDirectories=[/data/app/com.example.projectforbbs-2/lib/arm,/vendor/lib, /system/lib]]] couldn't find "libgdinamapv4sdk752.so" at java.lang.Runtime.loadLibrary(Runtime.java:367) at java.lang.System.loadLibrary(System.java:1076) at com.autonavi.amap.mapcore.MapCore.<clinit>(MapCore.java:60) at com.amap.api.mapcore.AMapDelegateImp.<init>(AMapDelegateImp.java:298) at com.amap.api.mapcore.j.<init>(AMapGLSurfaceView.java:26) at com.amap.api.mapcore.j.<init>(AMapGLSurfaceView.java:20) at com.amap.api.mapcore.at.a(MapFragmentDelegateImp.java:129) at com.amap.api.maps.MapView.onCreate(MapView.java:121) at com.example.projectforbbs.basic.BasicMapActivity.onCreate(BasicMapActivity.java:65)

很多同学看到这个错误的时候都比较惊讶,它报错是说MapView.onCreate有问题,就想肯定是sdk有问题。然而并不是这样,仔细看一下错误,主要是

nativeLibraryDirectories=[/data/app/com.example.projectforbbs-2/lib/arm,/vendor/lib, /system/lib]]] couldn't find "libgdinamapv4sdk752.so

找不到so文件,正常so文件是放在libs下面的和jar包放在一起,看一下工程:

发现问题,里面没有so文件!

加上so文件就可以正常运行了。

so文件异常:

下面也有一种情况会报上述问题,但是so和jar包都是有的。如图:

这也是一个很明显的错误,使用的是3.2.1的jar包对应so名称应该是gdinamapv4sdk752 .so截图里面是304.so'应该是2.7的sdk对应的版本,所以才会报这个错。

PS:如果把so名称修改了,同样的也是会报找不到的哦!

顺便贴一下 SDK 下载地址 http://lbs.amap.com/api/android-sdk/down/ 下错了的同学快去改过。

统一CPU架构

先来看一下3.2.1的SDK情况。

对比2.7.0看一下:

3.2.1比2.7.0少两个文件夹,armeabi-v7a和x86,这个是引起众多问题的罪魁祸首,不过不用担心,分分钟解决它。

拿x86平台举个例子,如果在x86的平台上,要运行sdk怎么办,3.2.1没有x86的so,很多同学想出了办法: ①把armeabi文件夹下面的so文件复制到x86下面;  ②把x86文件夹空着,什么也不放; 那么恭喜你,运行了之后会获得找不到so的错误。

解决办法是这样:

只保留armeabi文件夹,其他的统统删掉,因为大多数x86平台的手机都会兼容armeabi的版本。 但是会发现就算这样做了在模拟器上面依旧装不上,那是因为模拟器没有兼容,但是他可以替换平台。如果是genymotion的话,需要安装一个转换为arm的插件。

PS:当然,在以后的版本中其他CPU架构的 so 文件也会逐步给出来的~

更改Gradle jniLibs配置:

如果使用的是Android Studio,还有一个地方需要注意一下,AS(Android Studio)和eclipse不一样,eclipse把so文件放到libs目录下就可以了,但是AS的话,还需要自己处理一下。 在app/build.gradle中进行如下配置.注意!不是根目录的build.gradle。

sourceSets { main { jniLibs.srcDirs = ['libs'] } //… }

这样配置之后,AS工程里面打开,就会看见一个jniLibs

如不想配置,可以在app/src/main/这个目录下创建一个jniLibs文件夹把so文件放进去。

更改Gradle splits配置:

明明只保留了armeabi文件夹还是报错,这种情况也是有的,绝大多数原因都是打包脚本在作怪,特别是android studio很容易出问题 比如工程里面只保留了armeabi但是应用了一个第三方的AAR,它里面有其他平台,我也删不掉了咋办。打包的时候打出来自然就会有其他平台了。

android{ splits { abi { enable true reset() include 'armeabi'//只打包armeabi平台的,就算有其他文件夹也不管 } }

如以上内容仍未解决您的问题,请创建工单
返回顶部 示例中心 常见问题 智能客服 公众号
二维码