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