【问题标题】:Mono Android Monodroid Native Library DllNotFoundExceptionMono Android Monodroid 本机库 DllNotFoundException
【发布时间】:2012-01-10 23:33:37
【问题描述】:

我正在尝试使用 DllImport 在模拟器中获取与 Monodroid 一起使用的 Native C/C++ 库。我主要在 Windows/Visual Studio 2010 中进行开发。

我使用 Android NDK 工具构建了一个原生 C/C++ 库 (ZeroMQ),适用于 x86 和 armeabi 平台,使用 Ubuntu 虚拟机。这是正确的 - 模拟器的 x86 和真实设备的 armeabi 吗? (在 iPhone/MonoTouch 上肯定是这种情况——尽管在这种情况下静态链接 libzmq.a 文件和 DllImport __Internal)

我已经将 x86 版本的 libzmq.so 添加到了我的 MonoDroid 项目的目录结构 lib\x86\libzmq.so 下

当我第一次尝试构建/部署到模拟器时,我收到一个错误“无法确定 abi 类型”,因此我将 x86 添加到 AndroidNativeLibrary Include="lib\x86\libzmq.so"> 项目项组.然后部署。

我有一个用于调用 [DllImport("libzmq"

的函数的 DllImport

我尝试过 libzmq.so、lib/x86/libzmq、lib/x86/libzmq.so 等,但后来我调用 DllImported 方法(在模拟器中运行),我总是得到 DllNotFoundException。

谁能给我一些指导?

编辑:在阅读了另一个支持答案,其中指出模拟器使用 armeabi .so 库后,我删除了 x86/libzmq 并将我的 lib/armeabi/libzmq.so 添加为 AndroidNativeLibrary。我还删除了项目文件 Abi 条目,确实项目构建和部署良好。

但是,当我尝试调用 DllImported 函数时,仍然得到 DllNotFoundException。有什么想法吗?

非常感谢

【问题讨论】:

    标签: xamarin.android


    【解决方案1】:

    【讨论】:

      【解决方案2】:

      (这是我在 ZeroMQ 邮件列表中回复您的电子邮件的重复)。

      此错误可能是由于在 Mono 项目中使用了不正确的平台目标造成的。我不确定 Mono/MonoDevelop 是否支持此功能,但您可能需要创建一个 ARM 平台目标,而不是 x86/x64/Any CPU。

      如果您尝试在面向 x64 的程序集与 x86 本机库之间进行 P/Invoke 互操作,您将遇到相同的错误,反之亦然。

      如果您使用 clrzmq 绑定来桥接 Mono 和 libzmq,则需要为 ARM 创建一个新的平台目标并重新构建绑定。该解决方案目前仅定义 x86 和 x64 平台目标。

      【讨论】:

        【解决方案3】:

        好的,我终于成功了!无论出于何种原因,ZeroMQ 都无法使用当前/最新的 NDK r7 正确构建。 http://www.zeromq.org/build:android 的说明使用 NDK r6。我还下载了旧版本的 NDK r5b(它是最容易找到下载的旧版本),并使用它重建了 ZeroMQ。结果,它现在可以在模拟器和手机上运行!

        【讨论】:

          猜你喜欢
          • 2011-03-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-12
          • 2017-02-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多