2014-03-27 46 views
0

我目前正在將一個庫從Linux移植到Android,並且遇到了一些麻煩。在Android中加載自定義的.so

該庫有一個擴展系統:它將在文件夾/usr/local/lib/{thelibname}/extensions/中查找具有特定擴展名的所有文件,檢查它們是否爲動態庫,並加載並調用處理程序(如果是這種情況)。

但是,我不認爲有可能修補Android中的基礎文件系統文件夾。 我看着資產,但他們沒有說服我,它看起來像他們更專注於圖像,音頻等...

是否有另一種方式嵌入一些.apk文件並通過枚舉後加載它們DIR*並致電dlopen

另一種可能性是將擴展與應用程序數據,但我不知道是否有一個標準的路徑,我可以硬編碼在庫中,是嗎?而且我不知道如何在安裝apk時將一些東西放入數據中? (我用QtCreator的代APK的)

回答

0

您可以輕鬆地從任何地方加載擴展庫中的文件系統,包括像/sdcard/和她的孩子的共享文件夾。任何應用程序(和其中的本地庫)都可以通過READ_EXTERNAL_STORAGE權限獲得對/sdcard/的完全讀取權限。

這樣你就可以建立在擴展功能將被單個APK不一定更新的文件夾(注意,WRITE_EXTERNAL_STORAGE奇巧的變化)。

如果要部署的所有擴展庫作爲APK的一部分,它是最容易把它們用來包裝的APK(ADT的,這是${project_root}/libs/armeabi)標準的文件夾,然後他們將被自動地安裝在/data/app-lib/${app_package} 。這種方法允許準備APK多個架構,準備相應的文件中${project_root}/libs/x86

注意,所有的庫必須有LIB前綴和。所以後綴,所以如mylib.solibcrypto.so.6將不起作用,即使理論上這樣的庫可以通過dlopen()加載。

您的應用已讀取/data/app-lib/${app_package}目錄的文件,以便您可以通過C代碼或從Java進行掃描。在Java中,即使您不想硬編碼該名稱,也很容易解決${app_package}。只需撥打getApplicationContext().getPackageName()即可。

在C中,您可以使用/proc/${pid}來查找共享庫的完整路徑,這樣您也將知道擴展的路徑。