所以,目前在Android上没有办法,而是手动预加载依赖的共享库。这对我来说很好,不是什么大不了的事。 android buildystem也存在一些问题(预构建库特性),因此我不得不为我的依赖共享库命名不同的构建: libsal.so 和 libsal-slim.so 的。根据构建设置,这两个中的一个使其成为最终的apk。然后,在java端,我尝试加载libsal.so,如果失败,那么我尝试加载libsal-slim.so。
它工作得很好,直到我们偶然发现了一个手机,它将libsal.so安装在/ system / lib中的默认固件中。出于这个原因,我的应用程序停止使用该手机,如果它是用libsal-slim.so构建的,因为它首先尝试加载libsal.so并从/ system / lib加载错误的库。
问题:如何确保只加载我的安装文件夹中的库?也许我可以以某种方式检索我的应用程序的安装文件夹并“计算”我的共享库的完整路径?我怎么能做那个java伏都教魔术?我是java和android一般的大时间菜鸟,如果这个问题看起来太天真了:)是的,我不会说英语(或者他们怎么说),请依靠c ++ [笑话结尾]
libsal.so不是实际名称,我只用它作为例子。
答案 0 :(得分:0)
使用System.load(fullpath_of_the_lib)
可能会解决您的问题。
但问题是获取fullpath_of_the_lib。事实上,android API不允许您获取资源的路径。你只能得到一个流来阅读它。
要解决此限制,您可以执行以下操作:
getAssets().open("libsal.so")
System.load(fullpath_of_the_lib_on_the_sd_card)
当然你只需要lib中的最后一步已经在sdcard上了。
更简单的替代方法是将lib重命名为libMyVeryUncommonLibraryName.so,以便它不会与其他库名冲突。