我正在尝试使用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。有什么想法吗?
非常感谢
答案 0 :(得分:1)
我没有任何直接的想法,为什么它不适合你; [DllImport("zmq")]
应该有用。
SanityTests sample行使DllImport
属性。
DllImport
:https://github.com/xamarin/monodroid-samples/blob/master/SanityTests/Hello.cs#L240 Android.mk
的{{1}}:https://github.com/xamarin/monodroid-samples/blob/master/SanityTests/jni/Android.mk libfoo.so
:https://github.com/xamarin/monodroid-samples/blob/master/SanityTests/SanityTests.csproj#L82 libfoo.so
ndk-build
纳入libfoo.so
:https://github.com/xamarin/monodroid-samples/blob/master/SanityTests/SanityTests.csproj#L96 答案 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。结果,它现在适用于模拟器和手机!