1. 程式人生 > >Android Studio上打的包在arm64位機器上找不到對應的so庫

Android Studio上打的包在arm64位機器上找不到對應的so庫

現象描述
Android Studio打出來的包在64位機器上報以下
java.lang.UnsatisfiedLinkError: dlopen failed: “libfoobar.so”

我們是在工程目錄中將32位的so庫拷貝到arm64-v8a中的

原因分析
apk包在安裝的時候,系統會把包中與自己的abi對應的lib目錄中的so庫檔案拷貝到system分割槽中,32位機器中只有一個目錄/system/lib,64位機器中有兩個目錄/system/lib和/system/lib64,app啟動進行連結時,64位機器中會先到/system/lib64目錄中去找,如果沒有找到再到/system/lib目錄中去找。如果你把32位的so庫拷貝到了lib64目錄中,會導致連結失敗,同樣,64位的so庫被拷貝到lib目錄中也會導致失敗,所以so庫要和目錄一一對應。

如果我們的工程的so庫目錄中沒有arm64目錄,預設情況下,Android Studio會在apk中自動建立一個空的arm64-v8a資料夾,並根據一些規則把某些so庫(具體是怎樣的規則,我也不知道)拷貝到這個目錄中,這樣就導致,在64位機器上在lib64目錄下找到的so庫並不是正確的so庫檔案,從而出現了上面的錯誤

解決辦法
解決辦法就是阻止Android Studio自動的生成arm64-v8a目錄,我們自己寫指令碼把對應的so庫檔案拷貝到build對應的目錄下
在build.gradle中寫入如下的指令碼

    sourceSets.main {
        jni.srcDirs = []
    }

    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn ndkLibsToJar
    }

    task ndkLibsToJar(type: Zip, description: 'Create a JAR of the native libs'
) { destinationDir new File(buildDir, 'libs') baseName 'ndk-libs' extension 'jar' from(new File(buildDir, 'libs')) { include '**/*.so' } into 'lib/' }

同時,我們把工程目錄中的對應的arm64-v8a目錄刪掉,大功告成

相關推薦

Android Studio打的包在arm64機器對應so

現象描述 Android Studio打出來的包在64位機器上報以下 java.lang.UnsatisfiedLinkError: dlopen failed: “libfoobar.so” 我們是在工程目錄中將32位的so庫拷貝到arm64-v8a中的

Fresco引起的在arm64機器對應so

背景 今天公司專案的應用,測試人員提了個bug,應用在檢視pdf文件時崩潰了,看了下崩潰日誌。 java.lang.UnsatisfiedLinkError: dlopen failed: "libs/armeabi-v7a/libmupdf.so" i

【已解決】Android studio中ADB啟動失敗,導致到虛擬機器或真機

adb server version (31) doesn't match this client (36); killing... error: could not install *smartsocket* listener: cannot bind to 127.0.0.1:5037: 通常每個套接字

Android Studio匯入arr包,報錯到***.arr的問題分析與解決

匯入arr包時遇到一個問題,無法找到對應的arr檔案,但是那個檔案明明就在那,見鬼了。既然arr檔案存在,那肯定是路徑的問題。肯定有人鬱悶的把檔案刪了,再倒入,試了多次,但是錯誤仍然堅挺的存在。其實

win10 android studio adb:CreateFileW 'nul' failed: 系統到指定的檔案

最新電腦新換了win10系統,重灌了android studio和sdk以後發現連上真機跑不起來安卓專案,android studio提示CreateFileW 'nul' failed: 系統找不到指

AndroidSo解決方法

報錯為:java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader 1. 執行時報錯java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader。

假設在32機器,請在2億個未經排序數字中出中間值 給出算法思路就可以

iad use tar www sina gtk 算法 irf 機器 訟23乙6j8型f漳略cshttp://shequ.docin.com/kln26571 kxYsa2矢62祭匝練6http://shufang.docin.com/sina_5847497260 1

對於svn的總結,包括Android studio配置svn, svn第一次傳專案,及忽略專案檔案

1.Android studio在使用svn的時候需要進行一些簡單的配置,在studio  中  file ->setting ->version contrl->SubVersion   ->配置(安裝的路徑 複製進來(xxxxx\svn.exe)

android studio在3.2.1版本新建專案遇到的坑

今天升級了 android studio 版本到3.2.1上,剛新建專案就出現編譯不通過,出現如圖所示: 解決辦法: 1、在工程的peoject的build.gradle中新增 mavenCentral() jcenter{url “http://jcente

inet_ntoa在64機器出錯

inet_ntoa用法如下: char *inet_ntoa(struct in_addr in);就是將struct in_addr結構轉換為IP地址的形式,struct in_addr這個結構應該不陌生吧,它的定義如下: struct in_addr{ u

在64機器VS2012編譯的32程式在XP系統執行提示Wow64EnableWow64FsRedirection無法定位於輸入點

Wow64EnableWow64FsRedirection()函式是64位計算機用於定義轉向的函式,在32位計算機中不存在轉向問題 因此,在32位計算機中的kernel32.dll庫中就不存在此函式,當程式執行在32位計算機中時,就會提示無法定位 解決方法: 採用函式指標的

Regsvr32 在64機器的用法

regsvr32是windows上註冊 OLE 控制元件(DLL 或 ActiveX )的常用命令。註冊 OLE 控制元件可更新 Windows 登錄檔中檔案的位置和功能,從而使程式正常執行。32位系統註冊32位控制元件,64位系統註冊64位控制元件,一般都沒有問題。一般容易

Android studio git 回滾檔案到一個版本的

0: VCS->Git->Reset HEAD 1: HEAD 後面新增~2 代表回退到上上次的版本,如果想要是上一次的版本就是HEAD~1 Reset Type:  Soft:選擇這個模式意思是僅僅撤銷commit而已,不影響你本地的任何

Android 判斷程式是否在虛擬機器執行

/** * 根據部分特徵引數裝置資訊來判斷是否為模擬器 * * @return true 為模擬器 */ private static boolean isFeatures() { return Bui

利用VS2013在win7 64機器搭建xgboost 0.6+Anaconda3 環境

1.所需材料: xgboost xgboost 0.6 如果不想使用 git clone –recursive https://github.com/dmlc/xgboost 這個命令,嫌棄網速慢的同學,請移步 下載 如果想使用老版本 xgboost 0

Android 一種在Dalvik虛擬機器多Dex載入優化的方案

在Android原始碼中,DexFile中有一個方法,其函式原型為: native private static int openDexFile(byte[] fileContents); 也就是通過byte陣列載入一個Dex,可以達到秒級載入,親自測了下

64機器DCOM配置:MMC -32仍到MicrosoftExcelApplication

在使用Microsoft.Office.Interop.Excel做excel合併匯出時(2010版),由於本機是win8 64位系統所以需要進行DCOM配置: 按照這裡的做法【http://www.

Android studio git 回滾檔案到一個版本

0: VCS->Git->Reset HEAD 1: HEAD 後面新增~2 代表回退到上上次的版本,如果想要是上一次的版本就是HEAD~1 Reset Type:  Soft:選擇這個模式意思是僅僅撤銷commit而已,不影響你本地

Android: Android Studio簽名打包的兩種方式(zz)

信息 rda pan 相同 prop .cn 一個 一次 ack 註:給我們自己開發的app簽名,就代表著我自己的版權,以後要進行升級,也必須要使用相同的簽名才行。簽名就代表著自己的身份(即keystore),多個app可以使用同一個簽名。如果不知道簽名是啥意思,請自行百度

Android Studio簽名打包應用

要求 系統環境變量 pro 技術 ces log sdn 數字簽名 調試 轉載請註明來源: http://blog.csdn.net/kjunchen/article/details/50812391 可直接看看以下的Android Studi