1

所以,目前Android上没有办法,只能手动预加载依赖的共享库。这对我来说很好,没什么大不了的。android buildsystem(预构建库功能)也存在一些问题,因此我不得不为我的依赖共享库的不同构建命名:libsal.solibsal-slim.so。根据构建设置,这两个中的一个会进入最终的 apk。然后,在 java 端,我尝试加载 libsal.so,如果失败,则尝试加载 libsal-slim.so。

一切都很好,直到我们偶然发现了一部手机,该手机在默认固件中安装了 libsal.so,安装在 /system/lib 中。出于这个原因,如果我的应用程序是用 libsal-slim.so 构建的,它就会停止在该手机上运行,​​因为它会首先尝试加载 libsal.so,然后从 /system/lib 加载错误的库。

问题:如何确保只加载安装文件夹中的库?也许我可以以某种方式检索我的应用程序的安装文件夹并“计算”我的共享库的完整路径?我怎么能做那个 java voodoo 魔法?一般来说,我是 java 和 android 的大菜鸟,如果这个问题看起来太天真了 :) 是的,我不会说英语(或者他们怎么说),请依靠 c++ [结束笑话]

libsal.so 不是实际名称,我仅用作示例。

4

1 回答 1

0

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

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

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

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

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

一个更简单的选择可能是将您的库重命名为 libMyVeryUncommonLibraryName.so 之类的名称,这样它就不会与另一个库名称冲突。

于 2013-01-30T21:27:09.967 回答