[ Android实战 ] java.lang.UnsatisfiedLinkError: No implementation found for xxx 问题解决
[ Android實戰 ] java.lang.UnsatisfiedLinkError: No implementation found for xxx 問題解決
- 背景
- 日志分析
- 解決問題
- 總結
尊重原創,轉載請注明出處!
創作不易,如有幫助請點贊支持~
背景
最近又開始調之前爛尾的一個項目,在我們的產品上調試一個外設。當時調到一半,基本功能已經調通了,結果因為某些原因停滯了。。。
前幾天,領導又要求重新調試?;剡^頭來看項目,好家伙,一年多前寫的代碼已經基本不認識了,一看SDK,和之前調試的代碼相比,API接口也更新了。
好吧,老老實實重新調試,在demo應用上調試通過,移植到系統服務中,編譯,推應用,推庫,重啟機器,崩潰。。。
日志分析
抓了系統日志,其中崩潰的關鍵日志如下:
--------- beginning of crash 12-25 10:21:18.413 1314 1314 E AndroidRuntime: FATAL EXCEPTION: main 12-25 10:21:18.413 1314 1314 E AndroidRuntime: Process: com.xxx.xxx, PID: 1314 12-25 10:21:18.413 1314 1314 E AndroidRuntime: java.lang.UnsatisfiedLinkError: No implementation found for MVIDPDACodeReaderWrapper.MVIDCodeReaderDefine$Handle MVIDPDACodeReaderWrapper.MVIDCodeReader.MVID_CR_CreateHandleByPath(java.lang.String, int, int) (tried Java_MVIDPDACodeReaderWrapper_MVIDCodeReader_MVID_1CR_1CreateHandleByPath and Java_MVIDPDACodeReaderWrapper_MVIDCodeReader_MVID_1CR_1CreateHandleByPath__Ljava_lang_String_2II) 12-25 10:21:18.413 1314 1314 E AndroidRuntime: at MVIDPDACodeReaderWrapper.MVIDCodeReader.MVID_CR_CreateHandleByPath(Native Method) 12-25 10:21:18.413 1314 1314 E AndroidRuntime: at MVIDPDACodeReaderWrapper.MVIDCodeReader.MVID_CR_CreateHandle(MVIDCodeReader.java:41) 12-25 10:21:18.413 1314 1314 E AndroidRuntime: at com.hikrobot.api.MvidCodeRead.createHandle(MvidCodeRead.java:88)從日志中可以很明顯看到在so中找不到對應的native方法,因此拋出UnsatisfiedLinkError異常。
解決問題
so 用 demo 調試過,按理來說不應該有問題。難道是因為 so 沒有更新成功?
手動把 out 目錄下 /system/lib/ 下對應的 so 刪除,重新把最新的 so 拷貝到系統中,touch Android.mk,重新編譯,可以看到 /out/target/product/xxx/system/lib/libXXX.so 的日期是最新的。嗯,應該沒問題了,再次推庫,重啟機器,又崩了,一樣的報錯。。。
好吧,老老實實分析下這個問題。
先在服務器上分別對源碼中的 so 以及 out 目錄下的 so 分別執行了 nm -D libXXX.so | grep MVID_CR_CreateHandleByPath,看是否存在此函數。
結果源碼中的 so 正常輸出了此函數,而 out 目錄下的 so 則無輸出!
一開始我還以為是原始 so 或者編譯選項的問題,導致編譯后函數丟失,還查了半天資料,結果一無所獲。
然后被同事提醒了一下,突然想起來除了 /system/lib/, out 目錄下還有其他 so 的緩存。
xxx@xxx-bu2-dev3:~/xxx/out$ find . -name "libXXX.so" ./target/product/xxx/obj/SHARED_LIBRARIES/libXXX_intermediates/LINKED/libXXX.so ./target/product/xxx/obj/SHARED_LIBRARIES/libXXX_intermediates/libXXX.so ./target/product/xxx/obj/SHARED_LIBRARIES/libXXX_intermediates/PACKED/libXXX.so ./target/product/xxx/symbols/system/lib/libXXX.so ./target/product/xxx/system/lib/libXXX.so如果 intermediates 目錄下存在緩存,編譯時會使用這些緩存文件直接生成新的 so,這就是為啥編譯過一次之后,再次編譯會更快的原因。
手動把這些緩存的 so 全部刪掉,再在應用路徑下執行 mm 編譯整個模塊,生成 so,推到機器里面,重啟,沒有崩潰,功能正常,問題成功解決~
總結
其實是很簡單的問題,之前開發調試過程中也有遇到過 No implementation found for xxx 的問題,但是一時沒想起來,意識到緩存的問題后也就知道如何解決了。
所以還是得時不時地總結、回顧一下,這樣遇到問題才能更得心應手地解決問題~
遇到 java.lang.UnsatisfiedLinkError: No implementation found for xxx 的問題時,可以按照以下思路定位問題:
1、先確認 so 是否存在于應用或系統中,比如 /data/app/[package name]/lib/ 目錄下或 /system/lib/ 目錄下等
2、通過 nm -D | grep [function name],可以確認 so 中是否存在對應的函數。如果原始 so 都不存在此函數,則可以排除自己應用的問題了。
3、編譯 so 時一定要記得清緩存,如果是普通應用開發可以 clean 工程,如果是系統服務或應用,則需要手動刪除 out 下的相關 so,或者執行 make clean-[module name],直接清除指定模塊的所有緩存
總結
以上是生活随笔為你收集整理的[ Android实战 ] java.lang.UnsatisfiedLinkError: No implementation found for xxx 问题解决的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【axios源码】- 取消请求cance
- 下一篇: Easyui datagrid数据清空