日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

[ Android实战 ] java.lang.UnsatisfiedLinkError: No implementation found for xxx 问题解决

發布時間:2023/12/20 Android 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [ 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 问题解决的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。