2013-05-14 76 views
5

我想链接一个静态库(foo.a) - 其中包含C++代码 - 在Xamarin的文档中找到的directions之后的Xamarin.Android项目中。 “路径嗅探方法”和“项目文件中的Abi元素”方法都不起作用。使用Xamarin.Android:你如何链接静态库?

两种方法,我得到未处理的异常,当我尝试打电话到库函数:

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

我要指出,我就不会有任何麻烦联和调用到这个库(内置对ARMv7,armv7s)与我的Xamarin.iOS项目使用“额外mtouch参数”-cxx方法描述here。我所有的DLLImport在不同平台上都是一样的...

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

那么,我错过了什么?

FYI: 我使用Xamarin Studio的4.0.5(建4),Xamarin.Android 4.6.4(商务版)

+0

它可能工作,如果你的DllImport(“__内部”) – tofutim 2016-12-12 18:19:13

回答

7

我意识到这个问题是一岁,但因为我最近不得不做到这一点,并在同一个点击中我的头,我会尽力去...

TL; DR:你不能将静态库与Xamarin for Android链接,你只能链接动态库( .so)

步骤:

  • 如果您的图书馆是用C编写的,则可以跳过第一步。但是如果你的lib是用C++编写的,你必须首先在你的代码中声明你的公共导出函数为C函数(即你必须把它们放在#extern“C”{}块中)。如果你不这样做,你的函数名将会受到C++名称的影响,Xamarin将无法找到它们。
extern "C" 
{ 
    void my_function(bool someParameter); 
} 
  • 使用Android NDK,编译库动态链接库(的.so)。静态库(.a)将不是做的。这是我的头脑,因为这从文档中不太清楚。在IOS中,这是正好相反:您可以链接静态.a库只有那里(根据AppStore策略)。
  • 为你做这个希望支持每个处理器架构(通常,armeabi,armeabi-V7A和x86)
  • 从这里开始,我假定你有一组的.so库,每个处理器一个木构建筑的。这些库全部命名为libX.so,其中X是库的项目名称。例如。 “libmylibrary.so”。
  • 在您的Xamarin Android项目中,在项目根目录下添加一个文件夹“libs”。 (如果您愿意,也可以使用其他名称)
  • 在文件夹“libs”下面,分别创建三个子文件夹,分别命名为“armeabi”,“armeabi-v7a”和“x86”。将其中一个.so文件复制到每个这些子文件夹(对应于相同处理器体系结构的文件夹)。这使Xamarin的“路径嗅探”功能可以为正确的处理器架构选择正确的库。
  • 包括三个。所以在你的项目,并为每一个集合的“生成操作”属性文件“AndroidNativeLibrary”
  • 现在添加录入功能为静态方法与正确的DllImport一个Xamarin类属性:
namespace MyApp 
{ 
    public static class MyLibrary 
    { 
     [DllImport("libmylibrary", EntryPoint = "my_function")] 
     public static extern void MyFunction(Boolean someParameter); 
    } 
} 
  • 就是这样。您现在应该能够从您的Xamarin的C#代码调用MyLibrary.MyFunction()