Android6.0百度地图导入UnsatisfiedLinkError的问题

文章目录

前言

今天用 AS 写一个带有百度地图相关的项目时,发现了一个问题

提示

1 Error:Execution failed for task ':app:compileDebugNdk'.
2> Error: Your project contains C++ files but it is not using a supported native build system.
3Consider using CMake or ndk-build integration with the stable Android Gradle plugin:
4 https://developer.android.com/studio/projects/add-native-code.html
5or use the experimental plugin:
6 http://tools.android.com/tech-docs/new-build-system/gradle-experimental.

我就找原因,先点开了两个网页,发现一个是用 CMake 构建 ndk 的还一个是用 experimental 插件构件 ndk 项目的
这两个方式的共通点是都有 c 的源码,自己生成 so 文件,都不是我想要的
因为以前这么写没有问题,我在网上找相同的问题,大家都是说把 targetVersion 改成 23 以下就解决了,但是这不是我想要的,况且我这么用了也没解决问题,毕竟 targetVersion 迁移到 23+是大势所趋

我找了下原因,应该是 so 文件的原因,在 6.0 中添加了一个安全性的规范,大概意思是说,不能引用外部的 so 库,这样会有安全性的问题

索性,我在网上找到了一个解决方案

这个博客给了我一个方案

在 app 级的 build.gradle 中添加这么一段代码

1compile fileTree(dir: 'libs', include: '*.jar')
 1android {
 2    ...
 3    //设置so引入
 4    task nativeLibsToJar(type: Zip, description: "create a jar archive of the native libs") {
 5        destinationDir file("$projectDir/libs")
 6        baseName "Native_Libs2"
 7        extension "jar"
 8        from fileTree(dir: "libs", include: "**/*.so")
 9        into "lib"
10    }
11
12    tasks.withType(JavaCompile) {
13        compileTask -> compileTask.dependsOn(nativeLibsToJar)
14    }
15    //.so引入 end
16    ...
17}

这个大概意思就是建立一个 nativeLibsToJar 任务栈(这里的相关知识请查阅 gradle),这个任务栈将 libs 中的所有 so 文件打包到 Native_Libs2 中,这个压缩包中的结构是 lib/(cpu)/*.so,打包方式是 zip

当然,这里需要将所有的 so 文件按照标准结构放到 libs 文件夹中,不然是打不到的

完成后的目录结构如下

图片

查看手机

我的手机有 root 权限,可以看到应用文件夹

图片

图片

我们看到,这里的 so 文件会被放到应用的内部文件夹下,这样就不会出现外部 so 的引用问题了

我的手机是魅族 pro5,android5.1 的系统,测试通过,6.0+暂时还没测试,不过工程起码能跑起来了,后续看看有没有别的 6.0 手机拿来用用看

项目代码可以 git 下来,github 太慢,我放在了 oschina 的 git 服务器上
keystore 我也放在项目中了,不过得自己修改下才能运行