2013-05-14 9 views
5

Я пытаюсь связать статическую библиотеку (foo.a) - которая содержит код C++ - в проекте Xamarin.Android, следуя directions, найденному в документах Xamarin. Ни метод «метода обхода пути», ни метод «Аби-элемент в файле проекта» не работают.Xamarin.Android: Как вы связываете статическую библиотеку?

При использовании любого метода я получаю необработанное исключение при попытке вызвать в функцию библиотеки:

I/mono(2591): [ERROR] FATAL UNHANDLED EXCEPTION: System.EntryPointNotFoundException: ... 

Я должен упомянуть, что у меня не было никаких проблем, связывающие и призывающей в эту библиотеку (построено для ARMv7, armv7s) с моим проектом Xamarin.iOS с использованием «дополнительных аргументов mtouch» -cxx, описанных here. Все мои DLLImports одинаковы на всех платформах ...

[DllImport(Import.lib, CallingConvention=CallingConvention.Cdecl)] 
internal static extern IntPtr FooMethodName(args); 

Итак, что мне не хватает?

FYI: Я использую Xamarin Студию 4.0.5 (сборка 4), Xamarin.Android 4.6.4 (Business Edition)

+0

Это может сработать, если вы DllImport («__ Internal») – tofutim

ответ

7

Я понимаю, что этот вопрос больше года назад, но так как я недавно был сделайте именно это и ударитесь головой в то же самое место, я все равно пойду на это ...

TL; DR: вы не можете связывать статические библиотеки с Xamarin для Android, вы можете связывать только динамические библиотеки (.so)

Этапы:

  • Если ваша библиотека написана на C, вы можете пропустить первый шаг. Но если ваша lib написана на C++, вы должны сначала объявить свои публично экспортированные функции как C-функции в вашем коде (т. Е. Вы должны поместить их в блок #extern «C» {}). Если вы этого не сделаете, ваши имена функций будут подвергнуты обработке имени C++, и Xamarin не сможет их найти.
extern "C" 
{ 
    void my_function(bool someParameter); 
} 
  • Использование Android NDK, скомпилировать библиотеку динамически подключаемую библиотеку (.so). Статическая библиотека (.a) будет не do. Здесь я ударился головой, поскольку это не так ясно из документации. Добавляя к путанице, на IOS это прямо противоположное: вы можете связать статические .a libs только там (согласно политике AppStore).
  • Сделайте это для каждой архитектуры процессора, которую вы хотите поддержать (как правило, armeabi, armeabi-v7a и x86)
  • Отныне я предполагаю, что у вас есть набор .so библиотек, по одному для каждой архитектуры процессора. Все библиотеки называются libX.so, где X - имя проекта вашей библиотеки. Например. "Libmylibrary.so".
  • В вашем проекте Xamarin Android добавьте папку «libs» под корнем проекта. (Вы также можете использовать другое имя, если хотите)
  • Ниже папки «libs» создайте три дочерние папки под названием «armeabi», «armeabi-v7a» и «x86» соответственно. Скопируйте один из ваших .so-файлов в каждую из этих дочерних папок (тот, который соответствует той же архитектуре процессора). Это позволяет функции Xalarin «обнюхивать путь», которая будет выбирать нужную библиотеку для правильной архитектуры процессора.
  • Включите три.так что файлы в вашем проекте и для каждого набора собственности «Build Action», чтобы «AndroidNativeLibrary»
  • Теперь добавьте функции ввода как статические методы в классе Xamarin с соответствующим DllImport атрибуты:
namespace MyApp 
{ 
    public static class MyLibrary 
    { 
     [DllImport("libmylibrary", EntryPoint = "my_function")] 
     public static extern void MyFunction(Boolean someParameter); 
    } 
} 
  • Вот и все. Теперь вы можете позвонить MyLibrary.MyFunction() из кода Xamarin C#
Смежные вопросы