簡體   English   中英

在Android中,如何強制本機代碼使用我的共享庫版本,而不是系統的?

[英]In Android, how to force the native code to use my version of a shared library, instead of the system's?

Android已經擁有PCRE共享庫(“/system/lib/libpcre.so”),但它的編譯沒有Unicode支持,因此我為Android構建了自己的PCRE版本。 我的本機代碼鏈接到PCRE共享庫。 但是,當我運行我的應用程序時,它使用系統的PCRE版本,而不是我構建的版本,即使我的APK確實包含我的PCRE版本。 如何使用我的PCRE版本而不是系統? 一般在Linux中我使用“LD_LIBRARY_PATH”或“RPATH”,但在Android上我不知道如何使用它們,如果可能的話。

您可以在加載主庫​​之前load("your-path-to-lib") 使用此API,您可以在任意位置加載本機庫。 但最簡單的方法是依賴構建和安裝程序的默認行為,它將在libs/<ABI>文件夾中找到的本機庫(名為lib something .so )打包到APK文件中,然后解壓縮ABI變量將目標與之匹配

getContext().getApplicationInfo().nativeLibraryDir

(這是在API級別9中添加的)

如果庫是預先加載的,那么你就不能將你的庫與系統庫並排放置,因為有一個錯誤的版本是舊版本的Android。 您仍然可以使用dlclose()手動卸載它:

handle = dlopen("<libname>", RTLD_NOLOAD);
dlclose(handle);
dlclose(handle); // twice, because dlopen() increments ref count

你可能會在一個單獨的小dlclose_helper.so進行這些操作。 在加載主庫​​之前加載此幫助程序加載,主庫需要私有版本的<libname>

為API級別23引入了一個修復程序,它允許我們最終加載dir1/libx.sodir2/libx.so (請參閱官方文檔 )。

請注意,對於API級別24,還引入了限制對系統庫的訪問的新限制 (您只能加載列入白名單的庫)。

我相信唯一的方法是重命名庫(例如libpcre_myapp)。

請注意,僅重命名文件可能還不夠,但更改了SO_NAME ELF屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM