Android 加載so失敗-----記一次奇怪的so加載問題

1,問題描述

修改依賴的so的名稱導致依賴文件尋找錯誤。

2,前提:

(1)項目中需要使用兩個so,假設命名爲liblz_base_api.so和liblz_face_api.so,

(2)其中liblz_base_api.so定義的是公共方法,可能在不止liblz_face_api.so中會使用,其他so也會使用,使用提到了一個公共的方法中

(3)因爲有依賴關係,所以先加載liblz_base_api.so再加載liblz_face_api.so

--------分割線到此時爲止沒有任何問題,下面介紹出現問題的地方

(4)在某一天我感覺liblz_base_api.so的名字不太合適,所以直接將liblz_base_api.so改成了liblz_base_api_midify.so,(注意此時是直接改了so的名字,而不是修改Android.mk文件中的LOCAL_MODULE來重新編譯生成新的名字)

(5)第四步之後,修改liblz_face_api.so依賴新的文件名稱liblz_base_api_midify.so,然後 同樣加載,先加載liblz_base_api_midify.so再加載liblz_face_api.so

(6)經測試android5.0之後的手機沒有問題,但是華爲榮耀6p,android4.4版本,加載失敗,失敗log:

dlopen("/data/app-lib/com.hanlz.demo-1/liblz_face_api.so") failed: dlopen failed: could not load library "liblz_base_api.so" needed by "liblz_face_api.so"; caused by library "liblz_base_api.so" not found

(7)根據log分析:liblz_face_api.so加載依賴的so的時候,加載了根據Android.mk文件直接編譯出來的so的名字,而不是我修改過之後的

3,問題解決

修改依賴的so名字即liblz_base_api.so更名成liblz_base_api_midify.so,不能直接修改文件名稱,而是要降Android.mk中的LOCAL_MODULE修改成爲新的名字:lz_base_api_midify,然後重新編譯即可。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章