【问题标题】:How can I load a library with the System.load() function?如何使用 System.load() 函数加载库?
【发布时间】:2012-07-09 10:14:40
【问题描述】:

我需要为我的 Android Eclipse 项目加载库 ld-uClibc-0.9.30.1.so。我尝试从我的主机使用Sytem.load("/root/workspace/libs/ld-uClibc-0.9.30.1.so") 加载它,但出现错误:

Cannot load library /root/workspace/libs/ld-uClibc-0.9.30.1.so. Library not found.

这是怎么回事?为什么它不适用于 System.load?

【问题讨论】:

  • 这听起来不像是 Android 兼容库
  • 好的,你能告诉我如何知道一个库是否与 Android 兼容吗?
  • 由生成它的工具链,或加载它的错误。但是,在这种情况下,如果库建议使用名称。 uClibc 是用于小型系统的 C 库,但 Android 有自己的 C 库,称为 Bionic,它在您的应用启动时已经加载。您应该使用 android ndk 重新编译需要它的代码,以便它与 Bionic 链接。
  • 好的,ld-uClibc-0.9.30.1.so 是 libusb.so 的一个依赖项。我没有用 ndk 编译 libusb.so。我只从 Android 设备的 /usr/lib 文件夹中获取它。那么你认为我必须用 ndk 编译 libusb.so 才能完成这项工作吗?你的意思是“..需要这个的代码..”吗?
  • 如果它真的带有 /usr/lib/libusb.so,这似乎是一个不寻常的 android 设备。当且仅当这些库在设备上提供时,System.load("/usr/lib/ld-uClibc-0.9.30.1.so") 或无论文件路径是什么,在 logcat 中生成什么错误?

标签: android android-ndk libusb


【解决方案1】:

将库添加到项目文件夹内的libs文件夹中,然后调用

System.loadLibrary("ld-uClibc-0.9.30.1");

【讨论】:

  • 我不是那样工作的。 System.loadLibrary("ld-uClibc-0.9.30.1");也不起作用。实际上,使用 System.load() 必须为库提供完整路径。但是还没有任何效果。
  • 它也不适用于 System.loadLibrary。可能是什么问题?
【解决方案2】:

刚刚意识到真正的问题是什么。我一直认为您正在尝试加载 uClibc C 库。但实际上,情况并非如此。您正在尝试加载 uClibc 动态链接器,以解决与 uClibc 而不是仿生链接的 libusb 版本中的依赖关系。

这是行不通的(至少没有淫秽的骇客)

您需要使用 ndk 工具链重建与仿生相关的所有内容,这可能通过其生成独立工具链功能来实现。

但是,试图让 libusb 在没有 root 或修改设备文件权限的情况下在 android 上运行可能是徒劳的。

【讨论】:

  • 好的,我如何重建与仿生相关的所有内容?很抱歉这个问题,但正如我已经提到的,我是一个绝对的 Android 初学者。让 libusb 在无根的 Android 设备上运行真的几乎不可能吗?主要问题是什么?我在互联网上没有找到太多关于它的信息。因为如果这是不可能的事情,我不想为此浪费太多时间。
  • 问题是您是否可以访问原始设备文件。 android 中的大多数其他地方你都不能,并且必须通过系统级用户空间代理进行交谈。
【解决方案3】:

我用 NDK 编译了 libusb.so,现在至少可以在 Android 项目中加载它。我认为这个话题可以被视为已回答。我将发布另一个关于在 Android 上使用 libusb 的问题。如果你们仍然给我一些好的提示,我将不胜感激,因为到目前为止它对我帮助很大。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多