【问题标题】:armeabi and armeabi-v7a folderarmeabi 和 armeabi-v7a 文件夹
【发布时间】:2011-09-09 02:54:23
【问题描述】:

我正在开发一个 Android 项目,并且正在使用 NDK 调用本机方法。 我有两个库(.so 文件),一个位于 libs/armeabi 文件夹中,另一个位于 libs/armeabi-v7a lib 文件夹中。

如果我尝试运行该应用程序,则它不会加载 /libs/armeabi 文件夹中的库。如果我将库文件移动到 libs/armeabi-v7a 文件夹,那么它会加载库,但 5 到 10 分钟后它会崩溃并给出分段错误错误。

我想知道库的位置(不同的文件夹)是否会导致这个问题。

【问题讨论】:

  • 嘿..你解决了吗?我有个疑问。如果我为 armv7-a 构建 ffmpeg。我可以在 armeabi 设备上使用它吗?我是新手。我已经为 armv7-a 交叉编译了它。

标签: android arm android-ndk eabi


【解决方案1】:

安装应用程序时,包管理器服务将扫描 .apk 并查找任何形式的共享库:

     lib/<primary-abi>/lib<name>.so

如果找到,则将其复制到$APPDIR/lib/lib.so 下,其中$APPDIR 对应于应用程序的特定数据目录。

如果没有找到,并且定义了辅助 ABI,则该服务将扫描以下形式的共享库:

    lib/<secondary-abi>/lib<name>.so

如果找到任何内容,则将其复制到 $APPDIR/lib/lib.so 下。

对于主/次abi,

Android 系统在运行时知道它支持哪些 ABI。更准确地说,最多使用两个特定于构建的系统属性来指示:

  • 设备的“主要”ABI,对应于系统映像本身使用的机器代码。

  • 一个可选的“辅助”ABI,对应于系统映像也支持的另一个 ABI。

例如,典型的基于 ARMv5TE 的设备只会将主要 ABI 定义为“armeabi”,而不会定义次要 ABI。

另一方面,典型的基于 ARMv7 的设备会将主要 ABI 定义为“armeabi-v7a”,将次要 ABI 定义为“armeabi”,因为它可以运行为两者生成的应用程序本机二进制文件。

此机制可确保在安装时自动从包中提取目标设备的最佳机器代码。

【讨论】:

  • armeabi 库是否与 armeabi-v7a 直接兼容?我的意思是-如果您将库从文件夹 armeabi 移动到文件夹 armeabi-v7a,它会起作用吗?如果他使用仅在 armeabi 中可用的库,同时他想使用仅在 armeabi-v7a 中可用的库,那么他会这样做。
  • 谢谢,我知道这个。我想知道如果将 armeabi 库放在 armeabi-v7a 文件夹中而不是 armeabi 文件夹中(在 armeabi-v7a 设备上),是否会出现额外的东西。我认为在某些情况下它可能会崩溃,如果设备认为它是为 armeabi-v7a 构建的。
  • @Stan 我在 armv7-a 的 Android.mk 文件中使用 armeabi/libxx.so。它崩溃了。
【解决方案2】:

库加载器将尝试寻找与您正在运行的架构最匹配的库。通常,您应该为您计划支持的每个 abis(armeabi、armeabi-v7a、x86、mips)编译一个版本的库,以便编译器可以正确优化。

目录结构是 Android 决定加载哪个库的方式,所以不要更改它是至关重要的。

【讨论】:

    【解决方案3】:

    我自己是新手,但走的是同一条路……据我所知,一个人可能只有一个共享库;要使用多个库,请将它们设为静态并将它们链接到一个共享库。当然,这假设您正在自己构建库;-)

    【讨论】:

    • 这是不正确的。拥有多个共享库是很有可能的,尽管它会引入额外的复杂性,很容易出错和出现问题。
    猜你喜欢
    • 2019-11-25
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    相关资源
    最近更新 更多