我试图实现NDK共享库,需要在Linux中编译的其他外部本机库作为.so文件。
我有以下关系:libl1依赖于libl2。
我尝试将prebuilt libl2.so作为共享并将其添加到libl1模块中。当我加载libl1时,编译好的所有内容和我的LG Nexus 4都能正常工作:
static {
System.loadLibrary('l1');
}
但它不适用于三星4.03 Android版本。在此设备中,它使用此代码:
static {
System.loadLibrary('l2');
System.loadLibrary('l1');
}
我发现Android ClassLoader无法加载依赖项。但为什么它在Nexus 4上运行良好?但不是三星设备?
答案 0 :(得分:2)
您在Nexus4上看到的行为是不可取的,我再次测试没有特殊处理,至少在v.4.2.2(构建JDQ39)上。也许你的Nexus上安装了其他一些Android?也许您的设备出于任何原因碰巧有文件/system/lib/libl2.so
?
预计三星设备的行为,这是Android团队认为正确的。所有共享库必须按照它们与Java的依赖关系的顺序加载,或者如果愿意,您可以始终显式调用dlopen()
,但是使用链接器解决了跨这些共享库的函数引用的所有简单性。