2014-03-27 45 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}来查找共享库的完整路径,这样您也将知道扩展的路径。