国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

安卓開發之so庫加載使用的那些坑

2019-11-09 18:19:23
字體:
來源:轉載
供稿:網友

世上本沒有路,踩坑的多了就把路填平了。

一、UnsatisfiedLinkError基本介紹

全名     java.lang.UnsatisfiedLinkError官方解釋     Throw if the java Virtural Machine cannot find an apPRopriate native-language definition of method declared native意思就是JVM找不到native method的native實現!   拋出這異常,肯定是你加載SO的姿勢不對!現在App很多功能都是通過集成第三方工具實現的,第三方工具很有可能在SO動態庫里實現核心功能(Bugly提供的libBugly.so,能捕獲這類C/C++異常!),所以就算你不用NDK開發也一定會跟SO打交道,你確定你加載SO的姿勢都對了嗎?二、錯誤場景分析1、低級錯誤——根本木有SO,你加載個球?。ode     System.loadLibrary(Bugly);libs     空運行設備     Android ARM設備運行結果     Crash!java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file “/data/app/com.tencent.bugly.demo-1/base.apk”],nativeLibraryDirectories=[/vendor/lib, /systemb]]] couldn’t find “libBugly.so”原因分析     apk安裝時,系統會把apk中libs目錄下armeabi的SO拷貝到應用的私有目錄下。所以libs里沒有放入SO,運行時肯定找不到SO。修復方式     添加SO:libs/armeabi/libBugly.so或加載代碼注釋掉://System.loadLibrary(Bugly) ;2、進階錯誤——根本木有X86的SO,在X86的設備上你加載個球啊!code     System.loadLibrary(Bugly);libs     libs/armeabi/libBugly.so運行設備     Android X86設備運行結果     Crash!java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file “/data/app/com.tencent.bugly.demo-1/base.apk”],nativeLibraryDirectories=[/vendor/lib, /systemb]]] couldn’t find “libBugly.so”原因分析     apk安裝時,x86設備上系統會把apk中libs目錄下x86的SO,拷貝到應用的私有目錄下。雖然libs下有armeabi的SO,但沒有放入x86的SO,運行時還是找不到libbugly.so。修復方式     添加SO:libs/x86/libBugly.so或加載代碼注釋掉://System.loadLibrary(Bugly) ;3、大坑——尼瑪,好難發現!code     if(getArch().contain(“arm”)){//只在arm下加載System.loadLibrary(Bugly) ;System.loadLibrary(Bugly2);}libs     libs/armeabi/libBugly.solibs/armeabi/libBugly2.solibs/armeabi-v7a/libBugly.so運行設備     Android ARMv7設備運行結果     Crash!java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file “/data/app/com.tencent.bugly.demo-1/base.apk”],nativeLibraryDirectories=[/vendor/lib, /systemb]]] couldn’t find “libBugly2.so”原因分析     apk安裝時,系統會把apk中libs目錄下armeabi-v7a整個目錄下的SO拷貝到應用的私有目錄下。因為armeabi-v7a下沒有放入libBugly2.so,運行時找不到libBugly2.so。不同的工具兼容的CPU架構不一致,就容易出這個錯誤了!例如:libBugly.so提供armeabi、armeabi-v7a、x86三種。但其它產品可能只提供了armeabi。如果把這些so都直接拷貝進apk,就會因為上述的原因直接crash,會誤以為該Crash是因為不同產品的so不能兼容導致的!修復方式     添加SO:libs/armeabi-v7a/libBugly2.so或直接刪除armeabi-v7a目錄,arm設備上系統會自動選擇armeabi4、天坑——尼瑪,巨難發現!java.lang.UnsatisfiedLinkError中couldn’t find “XX.so”的占比非常高,上面提的三個場景都是這種錯誤!但你見過下面這種錯誤嗎?java.lang.UnsatisfiedLinkError:dlopen failed: “**/*/arm/*.so” has unexpected e_machine: 3這是天坑啊,肯定是實習生挖的!如何出現的呢?code     if(getArch().contain(“arm”)){//只在arm下加載System.loadLibrary(Bugly) ;}libs     libs/armeabi/libBugly.so 坑爹實習生放入了x86編譯的libBugly.so(同名很容易出錯)運行設備     Android ARM設備運行結果     Crash!java.lang.UnsatisfiedLinkError: dlopen failed: “/data/app/com.tencent.bugly.crashreport.demo-2/lib/arm/libBugly.so” has unexpected e_machine: 3原因分析     apk安裝時,系統把armeabi下的libBugly.so放入應用的私有目錄中了!但這個libBugly.so不是arm的,而是x86編譯的libBugly.so運行時,系統檢察ELF文件中的e_machine字段的值,跟arm的不匹配,就會拋出這個異常了!5 java.lang.UnsatisfiedLinkError:No implementation found for XXX這種錯誤也是醉了,說是要建立跟c/cpp寫的代碼一樣的包名和java文件
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 禄劝| 渑池县| 海口市| 博乐市| 宿州市| 营山县| 乌审旗| 阿克苏市| 上饶县| 田东县| 浦北县| 璧山县| 华宁县| 常山县| 康保县| 诏安县| 福安市| 甘洛县| 天镇县| 阜城县| 丹凤县| 额尔古纳市| 寿光市| 工布江达县| 灌云县| 新干县| 平度市| 平阳县| 巴彦淖尔市| 鄂温| 阿巴嘎旗| 连南| 白银市| 新宾| 福安市| 于田县| 陈巴尔虎旗| 汉寿县| 青州市| 泰州市| 阿图什市|