Xamarin.android Android:如何链接静态库? 我试图链接一个静态库Fo.A.包含C++代码的XAMARIN。Android项目遵循XAMARIN文档中的发现。路径嗅探方法和项目文件方法中的Abi元素似乎都不起作用

Xamarin.android Android:如何链接静态库? 我试图链接一个静态库Fo.A.包含C++代码的XAMARIN。Android项目遵循XAMARIN文档中的发现。路径嗅探方法和项目文件方法中的Abi元素似乎都不起作用,xamarin.android,xamarin,Xamarin.android,Xamarin,当我尝试调用库函数时,无论使用哪种方法,我都会得到未处理的异常: I/mono( 2591): [ERROR] FATAL UNHANDLED EXCEPTION: System.EntryPointNotFoundException: ... 我应该提到的是,我使用所描述的附加mtouch参数-cxx方法,在Xamarin.iOS项目中链接并调用这个为armv7、armv7s构建的库时没有遇到任何问题。我所有的DLL端口在不同平台上都是相同的 [DllImport(Import.lib, C

当我尝试调用库函数时,无论使用哪种方法,我都会得到未处理的异常:

I/mono( 2591): [ERROR] FATAL UNHANDLED EXCEPTION: System.EntryPointNotFoundException: ...
我应该提到的是,我使用所描述的附加mtouch参数-cxx方法,在Xamarin.iOS项目中链接并调用这个为armv7、armv7s构建的库时没有遇到任何问题。我所有的DLL端口在不同平台上都是相同的

[DllImport(Import.lib, CallingConvention=CallingConvention.Cdecl )]
internal static extern IntPtr FooMethodName(args);
那么,我错过了什么

供参考:
我使用的是Xamarin Studio 4.0.5 build 4,Xamarin.Android 4.6.4 Business Edition

我意识到这个问题已经有一年多的历史了,但因为我最近不得不这么做,而且我的头撞到了同一个地方,我无论如何都要尝试一下

TL;DR:你不能将静态库链接到Xamarin for Android,你只能链接动态库。所以

步骤:

如果你的库是用C写的,你可以跳过第一步。但是如果你的LIB是用C++编写的,你必须先在代码中声明你的公共导出函数作为C函数,也就是说你必须把它们放在一个外部C {}块中。如果你不这样做,你的函数名会受到C++名字的限制,Xamarin将无法找到它们。 外部C { void my_function bool someParameter; } 使用AndroidNDK,将你的库编译成一个动态链接库。一个静态库。一个静态库不行。这就是我的想法,因为文档中没有那么清楚。更令人困惑的是,在IOS上,情况恰恰相反:根据AppStore策略,您只能链接static.a libs。 针对您希望支持的每个处理器体系结构(通常为armeabi、armeabi-v7a和x86)执行此操作 从这里开始,我假设您有一组.so库,每个处理器架构一个。这些库都命名为libX.so,其中X是库的项目名称。例如libmylibrary.so。 在Xamarin Android项目中,在项目根目录下添加一个文件夹libs。如果您愿意,也可以使用其他名称 在文件夹libs下面,创建三个子文件夹,分别命名为armeabi、armeabi-v7a和x86。将一个.so文件复制到这些子文件夹中,即对应于同一处理器体系结构的子文件夹。这将启用Xamarin路径嗅探功能,该功能将为正确的处理器体系结构选择正确的库。 将这三个.so文件包括在项目中,并为每个文件设置构建操作属性为AndroidNativeLibrary 现在,将入口函数作为静态方法添加到具有适当DllImport属性的Xamarin类中: 名称空间MyApp { 公共静态类MyLibrary { [DllImportlibmylibrary,EntryPoint=my_函数] 公共静态外部无效MyFunctionBoolean参数; } } 就这样。现在,您应该能够从Xamarin C代码中调用MyLibrary.MyFunction
如果你能做到这一点