1. 程式人生 > >Android6.0百度地圖匯入UnsatisfiedLinkError的問題

Android6.0百度地圖匯入UnsatisfiedLinkError的問題

前言

今天用AS寫一個帶有百度地圖相關的專案時,發現了一個問題
提示

 Error:Execution failed for task ':app:compileDebugNdk'.
> Error: Your project contains C++ files but it is not using a supported native build system.
Consider using CMake or ndk-build integration with the stable Android Gradle plugin:
 https://developer.android.com/studio/projects/add
-native-code.html or use the experimental plugin: 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庫,這樣會有安全性的問題

索性,我在網上找到了一個解決方案

http://blog.csdn.net/qq_29266921/article/details/50220821

這個部落格給了我一個方案
在app級的build.gradle中新增這麼一段程式碼

compile fileTree(dir: 'libs', include: '*.jar')  
android {
    ...
    //設定so引入   
    task nativeLibsToJar(type: Zip, description: "create a jar archive of the native libs"
) { destinationDir file("$projectDir/libs") baseName "Native_Libs2" extension "jar" from fileTree(dir: "libs", include: "**/*.so") into "lib" } tasks.withType(JavaCompile) { compileTask -> compileTask.dependsOn(nativeLibsToJar) } //.so引入 end ... }

這個大概意思就是建立一個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我也放在專案中了,不過得自己修改下才能執行
https://git.oschina.net/kikt/HomeMap.git