【问题标题】:Load a custom .so in Android在 Android 中加载自定义 .so
【发布时间】:2014-03-27 16:53:52
【问题描述】:

我目前正在将一个库从 Linux 移植到 Android,但遇到了一些问题。

lib 有一个扩展系统:它将在文件夹/usr/local/lib/{thelibname}/extensions/ 中查找所有具有特定扩展名的文件,检查它们是否是动态库,如果是则加载它们并调用处理程序。

但是,我认为不可能修改 Android 中的基本文件系统文件夹。 我查看了资产,但它们并没有说服我,看起来它们更适用于图像、音频等......

是否有另一种方法可以将一些文件嵌入到 .apk 中,然后通过枚举 DIR* 并调用 dlopen 来加载它们?

另一种可能性是将扩展与应用程序数据一起放置,但我不知道是否有标准路径可以在库中进行硬编码,有吗?而且我不知道如何在安装 apk 时将一些东西放入数据中? (我使用QtCreator来生成APK)

【问题讨论】:

    标签: android file-io android-ndk filesystems shared-libraries


    【解决方案1】:

    好的,我发现另一个问题帮助我解决了我的问题:

    How to integrate native runtime library with dlopen on NDK?

    【讨论】:

    • 如果标记为 android-ndk,您会得到更好的服务。
    【解决方案2】:

    您可以轻松地从文件系统中的任何位置加载扩展库,包括/sdcard/ 和她的孩子等共享文件夹。任何应用程序(以及其中的原生库)都可以通过 READ_EXTERNAL_STORAGE 权限获得对 /sdcard/ 的完全读取权限。

    通过这种方式,您可以建立一个文件夹,扩展程序不一定会由单个 APK 更新(请注意 KitKatWRITE_EXTERNAL_STORAGE 的更改)。

    如果您想将所有扩展库部署为 APK 的一部分,最简单的方法是将它们放在用于打包 APK 的标准文件夹中(对于 ADT,它是 ${project_root}/libs/armeabi),然后它们将自动安装在/data/app-lib/${app_package}。这种方法允许为多个架构准备一个 APK,在${project_root}/libs/x86 中准备适当的文件等。

    请注意,所有库都必须有 lib 前缀和 .so 后缀,例如mylib.solibcrypto.so.6 将不起作用,即使理论上此类库可以由 dlopen() 加载。

    您的应用具有对/data/app-lib/${app_package} 目录的读取权限,因此您可以使用 C 代码或 Java 对其进行扫描。在 Java 中,即使您不想硬编码此名称,也很容易解析 ${app_package}。只需拨打getApplicationContext().getPackageName()

    在 C 语言中,您可以使用 /proc/${pid} 查找共享库的完整路径,这样您也可以知道扩展的路径。

    【讨论】:

      猜你喜欢
      • 2021-09-03
      • 1970-01-01
      • 2011-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多