armeabi和armeabi-v7a文件夹

13
我正在开发一个Android项目,使用NDK调用本地方法。我有两个库(.so文件),其中一个位于libs/armeabi文件夹中,另一个位于libs/armeabi-v7a库文件夹中。
如果尝试运行应用程序,则无法加载/libs/armeabi文件夹中的库。如果将库文件移动到libs/armeabi-v7a文件夹中,它会加载库,但在5到10分钟后崩溃并显示分段错误。
我想知道库文件位置(不同的文件夹)是否可能导致此问题。

1
嘿,你解决了吗?我有一个疑问。如果我为armv7-a架构构建ffmpeg,能否在armeabi设备上使用它?我是新手。我已经交叉编译了armv7-a的版本。 - Chaitanya Chandurkar
3个回答

22

安装应用程序时,包管理器服务将扫描.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中可用的库的人可能会做的事情。 - Stan
1
谢谢,我知道这个。我想知道如果armeabi库放在armeabi-v7a文件夹而不是armeabi文件夹中(在一个armeabi-v7a设备上),是否需要额外的东西。我认为,在某些情况下,如果设备认为它是为armeabi-v7a构建的,则可能会崩溃。 - Stan
@Stan 我在 Android.mk 文件中使用 armeabi/libxx.so 用于 armv7-a。但是它会崩溃。 - zakjma

6

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

目录结构是Android确定要加载哪个库的方式,因此您不应更改它。


-6

我自己也是新手,但走着同样的路...据我所知,一个程序只能有一个共享库;要使用多个库,需要将它们变成静态库,并将它们链接到一个单独的共享库中。当然,这是建立在你自己构建库的基础上的 ;-)


2
这不是正确的。拥有多个共享库是完全可能的,尽管它会引入额外的复杂性,很容易出错并导致问题。 - tomwhipple

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接