C# 如何调用C++;Xamarin表单项目中的库代码-DllNotFoundException
我有Xamarin表单跨平台项目-Android、iOS和UWP。我有一个C++ DLL项目,我从其中创建了一个DLL。我的意图是在XAMARIN FrAMS交叉点中集成/调用这些C++代码。我知道如何用C代码控制台应用程序调用C++,而不是代码> dLimPult汇编指令,但是在XAMARIN上,我得到<代码> DLNONDUBFEXCEDUCTION< /COD> 那么,DLL文件必须复制或引用到哪里才能工作呢C# 如何调用C++;Xamarin表单项目中的库代码-DllNotFoundException,c#,c++,xamarin.forms,xamarin.android,C#,C++,Xamarin.forms,Xamarin.android,我有Xamarin表单跨平台项目-Android、iOS和UWP。我有一个C++ DLL项目,我从其中创建了一个DLL。我的意图是在XAMARIN FrAMS交叉点中集成/调用这些C++代码。我知道如何用C代码控制台应用程序调用C++,而不是代码> dLimPult汇编指令,但是在XAMARIN上,我得到 DLNONDUBFEXCEDUCTION< /COD> 那么,DLL文件必须复制或引用到哪里才能工作呢 我已经复制了调试文件夹中的.dll和其他文件(当前项目正试图在其中引用dll) 甚至尝
- 我已经复制了调试文件夹中的
和其他文件(当前项目正试图在其中引用dll).dll
- 甚至尝试添加对DLL文件的引用-出现错误无法添加文件
- 将C++ DLL项目添加到相同的解决方案中,并引用它给出了<代码>系统。
- 创建跨平台共享C++(我想这是NDK)库项目,但仍然得到相同的问题-<代码> DLNONDUBFUNDEXCEPUT> <代码> >
#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;
}
}
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();
}
}在花了这么多时间和测试之后,我发现了这个问题
在加载库中C++应该打包为<代码>,所以在Android中,(共享对象)扩展。 此文件必须打包并放置在android的
.apk
中
- 创建和编译XAMARIN C++跨平台共享库项目。
- 编译特定于Android的链接项目以获得不同的架构 .so:x86、x64、ARM、ARM64-这些对应于不同的ABI 也是
- 安卓ABI也是如此
- 选项1:创建
文件夹并将其设置为lib/abi\u name
,其中AnroidNativeLibrary
可以abi\u name
- 阿姆亚比
- armeabi-v7a
- arm64-v8a
- x86
- x86_64
重要注意事项:为了。所以要复制到APK文件夹结构的文件应该与上面的完全相同。如果设备支持的体系结构是arm64-v8a,但只创建x86文件夹,那么APK中就不会有文件,我们仍然会得到DllNotFoundException
- 选项2:如果有人想要工作代码,可以使用构建操作
将.so文件添加到android项目中。问题不在于xamcppdl.Shared.so,它不是xamcppdl.Shared.dll吗?根据教程,它应该是。所以我尝试了.dll和.so;它们都不起作用。Dll1.dll也不起作用也没有找到xamcppdl.Shared.so。它只是给出了带有HResult-hex地址的not found异常,没有提到这两种方法的.lib文件。DllNotFoundException不是更精确吗,没有找到哪个库?在我的内存中更精确…@NPE获得精确错误后,我更改了代码上的库名称,并尝试通过放置.so文件,但仍然是相同的错误。AndroidNativeLibrary
是否确定所有项目都是用相同的目标体系结构(x86或x64)编译的避免任何CPU说谎。嗨,我正在考虑使用一个现有的C++库在iMaxIn表单项目中为iOS、Android和UWP头投影仪,我看到了你的帖子,谢谢分享。但是,我觉得你只是在为Android头项目提供解决方案,当你说“对于Android,我必须把DLL转换成这样”.iOS和UWP不也是这样吗?Thanks@pixel当你创建跨平台C++项目时,你将得到D/Mono(20164):DllImport尝试加载:“libxamcpdll.so”。W/Mono(20164):DllImport无法加载库“dlopen failed:library”/data/app/com.companyname.C_utest-1/lib/arm64/libxamcpdll.so“未找到”。
。一个你可以使用iOS和UWP的文件,你可以使用你现有的DLL。我还没有创建任何C++项目。我基本上试图在XAMARIN中重用一个旧的C++库。我理解的是你可以使用C。++UWP和WPF Xamarin中的lib(DLL?),android和iOS仍然需要它们的特定文件,这些文件可以嵌入到安装包中。有人知道在Xamarin.Forms UWP项目中使用C库吗? <ItemGroup> <AndroidNativeLibrary Include="path/to/libFile.so"> <Abi>armeabi</Abi> </AndroidNativeLibrary>