加载一个自定义。所以在Android中
我目前正在将一个库从Linux移植到Android,我遇到了一些问题 lib有一个扩展系统:它将查找文件夹加载一个自定义。所以在Android中,android,file-io,android-ndk,filesystems,shared-libraries,Android,File Io,Android Ndk,Filesystems,Shared Libraries,我目前正在将一个库从Linux移植到Android,我遇到了一些问题 lib有一个扩展系统:它将查找文件夹/usr/local/lib/{thelibname}/extensions/中具有特定扩展名的所有文件,检查它们是否是动态库,如果是,则加载它们并调用处理程序 然而,我认为在Android中修补基本文件系统文件夹是不可能的。 我调查了资产,但他们没有说服我,看起来他们更倾向于图像、音频等 是否有另一种方法将一些文件嵌入.apk中,然后通过枚举DIR*并调用dlopen加载它们 另一种可能是
/usr/local/lib/{thelibname}/extensions/
中具有特定扩展名的所有文件,检查它们是否是动态库,如果是,则加载它们并调用处理程序
然而,我认为在Android中修补基本文件系统文件夹是不可能的。
我调查了资产,但他们没有说服我,看起来他们更倾向于图像、音频等
是否有另一种方法将一些文件嵌入.apk中,然后通过枚举DIR*
并调用dlopen
加载它们
另一种可能是将扩展与应用程序数据放在一起,但我不知道是否有一个标准路径可以在库中硬编码,是吗?我不知道在安装apk时如何在数据中添加一些内容?(我使用QtCreator生成APK)好的,我发现了另一个问题,它帮助我解决了我的问题:
您可以轻松地从文件系统中的任何位置加载扩展库,包括共享文件夹,如
/sdcard/
和她的孩子。任何应用程序(以及其中的本机库)都可以获得对/sdcard/
的完全读取权限
通过这种方式,您可以建立一个文件夹,在该文件夹中扩展不一定由单个APK更新(请注意KitKat中的更改)
如果要将所有扩展库部署为APK的一部分,最简单的方法是将它们放在用于打包APK的标准文件夹中(对于ADT,它是${project\u root}/libs/armeabi
),然后它们将自动安装在/data/app lib/${app\u package}
中。这种方法允许为多个体系结构准备APK,在${project_root}/libs/x86
等中准备适当的文件
请注意,所有库必须具有lib前缀和.so后缀,例如mylib.so
或libcrypto.so.6
将不起作用,即使理论上这些库可以通过dlopen()
加载
您的应用程序具有对/data/app lib/${app_package}
目录的读取权限,因此您可以从C代码或Java对其进行扫描。在Java中,解析${app_package}
很容易,即使您不想硬编码这个名称。只需调用getApplicationContext().getPackageName()
在C语言中,您可以使用
/proc/${pid}
找到共享库的完整路径,这样您还可以知道扩展的路径。如果标记了android ndk,您会得到更好的服务。