2011-08-30 140 views
4

我正在用一些相互依賴的庫移植一大塊本機代碼。加載代碼失敗,因爲Android鏈接器只在/system/lib/中查找依賴關係,而不在/data/data/com.packagename.nnn/lib的應用程序安裝目錄中查找依賴項。在Android上依賴加載共享庫

作爲第一種解決方法,我使用System.load()以正確的從屬順序從Java加載了所有.so文件。這個解決方案對我來說並不令人滿意,主要是因爲由於插件架構的緣故,一組庫由構建變爲構建。此外,用戶界面不需要太多瞭解本地庫。

我發現Android不支持RPATH或爲應用程序設置LD_LIBRARY_PATH。我發現唯一的解決方法是用完全合格的SONAME構建庫。

但是有些依賴關係是預先構建的。

  1. 是否可以編譯完全合格的標籤需要到我自己的圖書館,即使需要的。所以不具有完全合格的SONAME?

  2. 或者是否有可能修改現有的.so並用完全合格的替換它的SONAME或NEEDED而無需重新編譯?

+0

@tasaarni你有沒有想過這個?幾乎在這個確切的問題,我在DLL地獄。我的共享庫依賴依賴於libicu,它包含在許多Android設備上,但通常是舊版本,不包含我需要的符號。所以我試圖以正確的依賴順序(按照'ndk-depends')加載所需的庫 - 新的libicu似乎以這種方式加載好,但即使如此,依賴庫也無法找到符號它需要。我錯過了一個步驟嗎? – ephemer

回答

0

Mozilla的Fennec的加載從自定義緩存目錄一堆的共享對象的/數據/數據/包/目錄下,你可以看看他們的來源。

+0

感謝您的回答!我發現他們已經付出很多努力來加載。他們甚至實施了自己的[鏈接器]的修改版本(http://hg.mozilla.org/mozilla-central/file/0664108eb19d/other-licenses/android/linker.c)!他們可能已經解決了路徑問題,但對我來說,他們似乎仍然在執行[硬編碼的依賴關係加載](http://hg.mozilla.org/mozilla-central/file/0664108eb19d/other-licenses/android/ APKOpen.cpp#L651)。 – tsaarni