从另一个Android应用程序加载本机共享库

从另一个Android应用程序加载本机共享库,android,android-ndk,Android,Android Ndk,我需要发布一个应用程序(一个播放器),它依赖于为给定的ARM版本和扩展(Tegra,Neon)构建的本机库。这个本机库相当大,所以我不能在一个通用包中分发它的所有版本。因此,我决定将应用程序拆分为一个小的universal.apk和更专业的.apks插件,而不需要任何活动 如何从主主机应用程序访问插件应用程序中的专用本机共享库?可以简单地使用吗 System.loadLibrary("path_to_library"); 如果是的话,我怎样才能找到那个图书馆的路径 如果不可能,如何解决此问题

我需要发布一个应用程序(一个播放器),它依赖于为给定的ARM版本和扩展(Tegra,Neon)构建的本机库。这个本机库相当大,所以我不能在一个通用包中分发它的所有版本。因此,我决定将应用程序拆分为一个小的universal.apk和更专业的.apks插件,而不需要任何活动

如何从主主机应用程序访问插件应用程序中的专用本机共享库?可以简单地使用吗

System.loadLibrary("path_to_library"); 
如果是的话,我怎样才能找到那个图书馆的路径

如果不可能,如何解决此问题?

System.loadLibrary()
采用库名称并以某种方式将其映射到完整路径

foo=>libfoo.so

系统通常检查apk本身,然后通常检查
/system/lib/

如果有完整路径,请使用
System.load()

在任何情况下,管理lib的位置都会很麻烦,除非它在apk中或与所有系统lib一起


我只想用apk打包特定的库。

八年后,TS的主要问题得到了解决:有一些拆分可以为每个ABI生成更小的apk,有一些应用包可以更容易地打包,有一些扩展甚至允许延迟下载本机库,直到应用程序真正需要它


尽管如此,
System.load(“/data/data/{app package}/lib/lib{library name}.so”)的相同技术仍然有效,并且在某些情况下可能有用。

谢谢,你帮了我很多忙!我不知道System.load方法,现在它按预期工作。我不能把所有的库都打包成一个通用的。apk,它们太大了,需要50 MB的磁盘和超过100 MB的安装空间……”系统通常会检查apk本身,然后通常是/system/lib/“你知道订单是否保证是这样的吗?我想知道如果apk和/system/lib都包含相同的库,会发生什么情况,是否100%确定要加载的.so将是apk中的库?它首先查看apk,然后是正常的系统库。我有一些应用程序打包的库与同一命名系统库不同(更新/修改/黑客攻击)。我不完全确定您是否可以加载apk中未包含的库。您是否尝试过将
.so
上载到根设备,并尝试将
System.loadLibrary
及其路径上载到根设备?是的,这是可能的,我刚刚尝试过,它可以工作。好的。如何设置路径?因为我知道插件应用程序的包名,所以我使用
String path=context.getPackageManager().getPackageInfo(“packagename”,0).applicationInfo.dataDir+“/lib/libname.so”