gpt4 book ai didi

Xamarin.Android:如何链接静态库?

转载 作者:行者123 更新时间:2023-12-04 07:20:19 24 4
gpt4 key购买 nike

我正在尝试在 directions 之后的 Xamarin.Android 项目中链接包含 C++ 代码的静态库 (foo.a)在 Xamarin 的文档中找到。 “路径嗅探方法”和“项目文件中的 Abi 元素”方法似乎都不起作用。

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

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

我应该提到,我使用“附加 mtouch 参数”-cxx 方法描述的 Xamarin.iOS 项目链接和调用这个库(为 armv7、armv7s 构建)没有问题 here .我所有的 DLLImports 跨平台都是相同的...
[DllImport(Import.lib, CallingConvention=CallingConvention.Cdecl )]
internal static extern IntPtr FooMethodName(args);

那么,我错过了什么?

供引用:
我使用的是 Xamarin Studio 4.0.5(内部版本 4)、Xamarin.Android 4.6.4(商业版)

最佳答案

我意识到这个问题已经有一年多了,但是由于我最近不得不完全这样做,并且在同一个地方撞到了我的头,无论如何我都会试一试......

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

脚步:

  • 如果您的库是用 C 编写的,则可以跳过第一步。但是,如果您的库是用 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“路径嗅探”功能,该功能将为正确的处理器体系结构选择正确的库。
  • 在您的项目中包含三个 .so 文件,并将每个文件的“构建操作”属性设置为“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()
  • 关于Xamarin.Android:如何链接静态库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16533329/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com