Собственная библиотека Mono Android Monodroid DllNotFoundException - PullRequest
2 голосов
/ 11 января 2012

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

Я создал собственную библиотеку C / C ++ (ZeroMQ) с использованием инструментов Android NDK для платформ x86 и armeabi, используя виртуальную машину Ubuntu.Это правильно - x86 для эмулятора и armeabi для реального устройства?(Это, безусловно, относится к iPhone / MonoTouch - хотя в этом случае статически связанные файл libzmq.a и DllImport __Internal)

Я добавил версию libzmq.so для x86 в свой проект MonoDroid в структуре каталоговlib \ x86 \ libzmq.so

Когда я впервые попытался построить / развернуть на симуляторе, я получил ошибку «не могу определить тип 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 файла проекта, и действительно, проект собран и развернут нормально.

Однако, я все еще получаю DllNotFoundException, когда я пытаюсь вызвать функцию DllImported. Любые идеи?

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

Ответы [ 3 ]

1 голос
/ 11 января 2012

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

Образец SanityTests использует атрибут DllImport.

0 голосов
/ 16 января 2012

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

0 голосов
/ 13 января 2012

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

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

Если вы попытаетесь это сделать, вы увидите те же ошибкиP / Invoke взаимодействует между целевой сборкой x64 с собственной библиотекой x86 или наоборот.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...