Как вызвать код библиотеки C ++ из проекта Xamarin Forms — DllNotFoundException

У меня Xamarin формирует кроссплатформенный проект — Android, iOS и UWP. У меня есть проект C ++ DLL, из которого я создал DLL. Мое намерение состоит в том, чтобы объединить / вызвать этот код C ++ в формах Xamarin. Я знаю, как вызвать C ++ из консольного приложения C # с DLLImport инструкция по сборке, но на Xamarin я получаю DllNotFoundException,

Так, где файл DLL должен быть скопирован или на него есть ссылки, чтобы это работало?

  • Я скопировал .dll и другие файлы в папке Debug (где текущий проект пытается ссылаться на DLL. (Я сослался на это видео и это работает для консоли C # )
  • Даже пытался добавить ссылку на файл DLL — дает ошибку, не может добавить файл
  • Добавление C ++ DLL проекта к тому же решению и ссылки на него дают System.DllNotFoundException,
  • Создан кросс-платформенный общий библиотечный проект C ++ (я думаю, что он есть в NDK), но проблема все еще та же — DllNotFoundException,

Код:

  1. C ++

    #include "stdafx.h"
    extern "C"{
    
    __declspec(dllexport) int add(int a, int b)
    {
    return a + b;
    }
    __declspec(dllexport) int subtract(int a, int b)
    {
    return a - b;
    }
    }
    
  2. App.xaml.cs или любой другой стандартный проект .Net

    public partial class App : Application
    {
    [DllImport("Dll1.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern int subtract(int a, int b);[DllImport("Dll1.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern int add(int a, int b);
    
    [DllImport("XamCppDll.Shared.so")]
    public static extern int cpp_GetValue(int a, int b);
    
    public App()
    {
    InitializeComponent();
    
    int x = 100;
    int y = 15;
    int z = 0;
    int z1 = 0;
    try
    {
    cpp_GetValue(5, 6);//XamCppDll.Shared.so
    z = subtract(x, y);//Dll1.dll
    z1 = add(x, y);//Dll1.dll
    }
    catch (System.Exception ex1)
    {
    Debug.WriteLine(ex1.Message);
    }
    
    Debug.WriteLine(" {0} - {1} = {2}", x, y, z);
    Debug.WriteLine(" {0} + {1} = {2}", x, y, z1);
    
    MainPage = new MainPage();
    
    }
    

    }

Структура проекта

структура проекта

Учебники / коды приведены

https://blog.xamarin.com/build-and-debug-c-libraries-in-xamarin-android-apps-with-visual-studio-2015/

https://blogs.msdn.microsoft.com/vcblog/2015/02/23/developing-xamarin-android-native-applications/

2

Решение

Я решил эту проблему, потратив столько времени и протестировав.

Для загрузки библиотеки C ++ должен быть упакован как .soРасширение (Shared Object) в Android.

Этот файл должен быть упакован и помещен в .apk андроида.

  • Создать и скомпилировать проект Xamarin C ++ для кросс-платформенной общей библиотеки.
  • Скомпилируйте связанный с Android проект, чтобы получить другую архитектуру
    .so: x86, x64, ARM, ARM64 — они соответствуют различным ABI
    тоже.
  • Ссылка .so с Android-ABI

    1. Опция 1 : Создайте lib/abi_name папку и установите .so файл как AnroidNativeLibrary где abi_name может быть

      • armeabi
      • armeabi-v7a
      • arm64-V8A
      • x86
      • x86_64
        Важная заметка : Для того, чтобы .so файл копировался в APK, структура папок должна быть точно такой же, как указано выше. Если поддерживаемая устройством архитектура — arm64-v8a, но создается только папка x86, то .so файл не будет доступен в APK, и мы все равно получим DllNotFoundException.
    2. Вариант 2: Добавьте .so файл в проект Android с помощью действия Build AndroidNativeLibrary с <ABI> спецификатор тэга. В Android .csproj файл добавьте, как показано ниже.

      <ItemGroup>
      <AndroidNativeLibrary Include="path/to/libFile.so">
      <Abi>armeabi</Abi>
      </AndroidNativeLibrary>
      

Я добавил Github хранилище XamarinNDKSample для этого, если кто-то хочет рабочий код.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]