我正在开发一个 Android 项目,并且正在使用 NDK 调用本机方法。我有两个库(.so 文件),一个位于libs/armeabi
文件夹中,另一个位于libs/armeabi-v7a
lib 文件夹中。
如果我尝试运行应用程序,那么它不会在/libs/armeabi
文件夹中加载库。如果我将库文件移动到文件libs/armeabi-v7a
夹中,它会加载库,但 5 到 10 分钟后它会崩溃并给出分段错误错误。
我想知道库的位置(不同的文件夹)是否会导致这个问题。
我正在开发一个 Android 项目,并且正在使用 NDK 调用本机方法。我有两个库(.so 文件),一个位于libs/armeabi
文件夹中,另一个位于libs/armeabi-v7a
lib 文件夹中。
如果我尝试运行应用程序,那么它不会在/libs/armeabi
文件夹中加载库。如果我将库文件移动到文件libs/armeabi-v7a
夹中,它会加载库,但 5 到 10 分钟后它会崩溃并给出分段错误错误。
我想知道库的位置(不同的文件夹)是否会导致这个问题。
安装应用程序时,包管理器服务将扫描 .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”,因为它可以运行为两者生成的应用程序本机二进制文件。
此机制可确保在安装时自动从包中提取目标设备的最佳机器代码。
库加载器将尝试寻找与您正在运行的架构最匹配的库。通常,您应该为您计划支持的每个 abis(armeabi、armeabi-v7a、x86、mips)编译一个版本的库,以便编译器可以正确优化。
目录结构是 Android 确定要加载哪个库的方式,因此不要更改它至关重要。
我自己是新手,但走的是同一条路……据我所知,一个人可能只有一个共享库;要使用多个库,请将它们设为静态并将它们链接到一个共享库。当然,这假设您正在自己构建库;-)