Mono Android Monodroid Native Library DllNotFoundException

时间:2012-01-10 23:33:38

标签: xamarin.android

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

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

我在目录结构lib \ x86 \ libzmq.so中添加了x86版本的libzmq.so到我的MonoDroid项目

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

我有一个DllImport函数来调用[DllImport(“libzmq”

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

任何人都可以给我一些指导吗?

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

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

非常感谢

3 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

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

在Mono项目中使用不正确的平台目标可能会导致此错误。我不确定Mono / MonoDevelop是否支持这一点,但你可能需要创建一个ARM平台目标,而不是x86 / x64 / Any CPU。

如果您尝试在x64本机库的x64目标程序集之间进行P / Invoke互操作,反之亦然,则会遇到相同的错误。

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

答案 2 :(得分:0)

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