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,然後重新編譯即可。