У меня Xamarin формирует кроссплатформенный проект — Android, iOS и UWP. У меня есть проект C ++ DLL, из которого я создал DLL. Мое намерение состоит в том, чтобы объединить / вызвать этот код C ++ в формах Xamarin. Я знаю, как вызвать C ++ из консольного приложения C # с DLLImport
инструкция по сборке, но на Xamarin я получаю DllNotFoundException
,
Так, где файл DLL должен быть скопирован или на него есть ссылки, чтобы это работало?
.dll
и другие файлы в папке Debug (где текущий проект пытается ссылаться на DLL. (Я сослался на это видео и это работает для консоли C # )System.DllNotFoundException
, DllNotFoundException
,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;
}
}
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://blogs.msdn.microsoft.com/vcblog/2015/02/23/developing-xamarin-android-native-applications/
Я решил эту проблему, потратив столько времени и протестировав.
Для загрузки библиотеки C ++ должен быть упакован как .so
Расширение (Shared Object) в Android.
Этот файл должен быть упакован и помещен в .apk
андроида.
Ссылка .so с Android-ABI
Опция 1 : Создайте lib/abi_name
папку и установите .so файл как AnroidNativeLibrary
где abi_name
может быть
Вариант 2: Добавьте .so файл в проект Android с помощью действия Build AndroidNativeLibrary
с <ABI>
спецификатор тэга. В Android .csproj файл добавьте, как показано ниже.
<ItemGroup>
<AndroidNativeLibrary Include="path/to/libFile.so">
<Abi>armeabi</Abi>
</AndroidNativeLibrary>
Я добавил Github хранилище XamarinNDKSample для этого, если кто-то хочет рабочий код.
Других решений пока нет …