【问题标题】:Where to put c++ .so library needed for my android application在哪里放置我的 android 应用程序所需的 c++ .so 库
【发布时间】:2020-08-02 17:59:01
【问题描述】:

我制作了一个基于 ndk 的 android 应用程序,当我通过单击 Android Studio 中的运行按钮运行它时,我发现该应用程序已安装并在我连接的 android 设备上运行。但它抱怨它无法加载一些.so文件,如libc++_shared.solibomp.so,我做了一些研究,并在我的app\src\main文件夹中创建了一个jniLibs,并将这两个.so文件复制到其中,现在一切正常。

但是,我仍然不清楚到底发生了什么:

  1. 当我单击运行按钮时,应用程序安装/保存在设备上的位置,.so 文件是否复制到同一位置?
  2. 我怀疑将 .so 文件复制到 jniLibs 是否是一种好习惯,这样的 .so 文件可以由许多应用程序共享,如果每个应用程序都有自己的副本,更新它们就会变得困难。有没有办法将它们存储在一个公共位置以供应用共享?
  3. 我还可以在不同应用之间共享 android 设备上的 .so 文件吗?

【问题讨论】:

  • 如果您使用 Gradle 构建应用并使用其 externalNativeBuild NDK 集成并将 c++_shared 指定为您的 C++ 运行时库,libc++_shared.so 将自动与您的 APK 捆绑在一起。因此,如果这没有发生,可能是因为您正在使用一些自定义方法构建您的应用程序或本机库,而您没有向我们展示。
  • @Michael 谢谢你,当我添加到externNativeBuild 配置中时,它适用于 libc++_shared

标签: android android-ndk


【解决方案1】:
  1. 当我单击运行按钮时,应用程序安装/保存在设备上的位置,.so 文件是否复制到同一位置?

应用程序保存在/data/app/your.app.name-cert-hash== 和.so 库存储在同一位置,例如/data/app/your.app.name-cert-hash==/lib/x86(如果android:extractNativeLibs="true"在AndroidManifest.xml/application中,否则库直接压缩成.apk)。

为了发现 Android 文件系统,您可以使用 ADB(也可以使用模拟器):

  1. 从 AS 运行您的应用

  2. 以su模式运行adb shell:

    adb shell
    su
    ls -als /data/app
    
  1. 我怀疑将 .so 文件复制到 jniLibs 是否是一种好习惯,这样的 .so 文件可以由许多应用程序共享,如果每个应用程序都有自己的副本,更新它们变得很困难。有没有办法将它们存储在一个公共位置以供应用共享?

由于 Android 安全方法,这是不可能的。

  1. 我还可以在不同应用之间共享 android 设备上的 .so 文件吗?

没有。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多