12

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

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

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

4

3 回答 3

21

安装应用程序时,包管理器服务将扫描 .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”,因为它可以运行为两者生成的应用程序本机二进制文件。

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

于 2013-04-25T07:22:48.763 回答
5

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

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

于 2012-07-27T22:37:40.210 回答
-6

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

于 2011-09-22T17:07:55.373 回答