2012-01-10 6 views
2

Я пытаюсь получить Native C/C++ библиотеку, работающую с Monodroid в эмуляторе, используя DllImport. Я развиваюсь в основном в Windows/Visual Studio 2010.Mono Android Monodroid Native Library DllNotFoundException

Я создал собственную библиотеку C/C++ (ZeroMQ) с помощью инструментов Android NDK, как на платформах 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. поэтому ">. Затем это развернуто.

У меня есть DllImport для функции для вызова [DllImport ("libzmq"

Я попытался libzmq.so, Lib/x86/libzmq, Lib/x86/libzmq.so и т.д., но я называю метод DllImported (работает в эмуляторе), я всегда получаю DllNotFoundException

Может кто-нибудь дать мне направление

EDIT:.? После прочтения другой поддержки ответа, который гласит, что эмулятор использует armeabi библиотеку .so, я удалили x86/libzmq и добавили мою lib/armeabi/libzmq.so в качестве AndroidNativeLibrary. Я также удалил запись файла проекта Abi и, действительно, проект построен и развернут отлично.

Однако I все еще получает исключение DllNotFoundException при попытке вызвать функцию DllImported. Есть идеи?

Большое спасибо

ответ

0

Хорошо, я, наконец, получил его! По какой-то причине ZeroMQ не строит правильно, используя текущий/последний NDK r7. В инструкциях по адресу http://www.zeromq.org/build:android используется NDK r6. Я также загрузил старую версию NDK r5b (это была самая простая старая версия, чтобы найти загрузку) и переработал ZeroMQ, используя ее. Результат, теперь он работает на эмуляторе и телефоне!

1

У меня нет каких-либо непосредственных идей, почему это не работает для вас; [DllImport("zmq")] должен работать.

SanityTests sample Управляет атрибутом DllImport.

0

(Это повторение моего ответа на ваш адрес электронной почты в списке рассылки ZeroMQ).

Эта ошибка может быть вызвана неправильной целью платформы в вашем проекте Mono. Я не уверен, поддерживает ли Mono/MonoDevelop это, но вам, вероятно, нужно создать целевую платформу ARM, в отличие от x86/x64/Any CPU.

Вы столкнулись бы с теми же ошибками, если попытаетесь сделать P/Invoke interop между сборкой x64 с родной библиотекой x86 или наоборот.

Если вы используете привязки clrzmq для моста Mono и libzmq, вам нужно будет создать новую платформу для ARM и перестроить привязки. Решение определяет только целевые платформы x86 и x64.