Android JNI:仅来自install dir的loadlibrary

时间:2013-01-30 20:54:08

标签: android android-ndk

所以,目前在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不是实际名称,我只用它作为例子。

1 个答案:

答案 0 :(得分:0)

使用System.load(fullpath_of_the_lib)可能会解决您的问题。

但问题是获取fullpath_of_the_lib。事实上,android API不允许您获取资源的路径。你只能得到一个流来阅读它。

要解决此限制,您可以执行以下操作:

  • 将您的lib放在app资源文件夹中。
  • 在您的lib上打开一个InputStream:getAssets().open("libsal.so")
  • 在sdcard中创建一个名为“libsal.so”(或其他)的文件
  • 将输入流中的字节复制到刚刚创建的文件
  • 获取sdcard上“libsal.so”的绝对文件路径
  • 致电System.load(fullpath_of_the_lib_on_the_sd_card)

当然你只需要lib中的最后一步已经在sdcard上了。

更简单的替代方法是将lib重命名为libMyVeryUncommonLibraryName.so,以便它不会与其他库名冲突。