gpt4 book ai didi

c# - 如何从 Xamarin Forms 项目调用 C++ 库代码 - DllNotFoundException

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:40:25 35 4
gpt4 key购买 nike

我有 Xamarin 表单跨平台项目——Android、iOS 和 UWP。我有一个 C++ DLL 项目,我从中创建了一个 DLL。我的意图是在 Xamarin 中集成/调用这些 C++ 代码。我知道如何使用 DLLImport 汇编指令从 C# 控制台应用程序调用 C++,但在 Xamarin 上我得到 DllNotFoundException

那么必须将 DLL 文件复制或引用到哪里才能使其工作?

  • 我已经复制了 .dll 和 Debug 文件夹中的其他文件(当前项目正在尝试引用 DLL。(我引用了这个 video,它适用于 C# 控制台 )
  • 甚至尝试添加对 DLL 文件的引用 - 给出错误无法添加文件
  • 将 C++ DLL 项目添加到同一解决方案并引用它会产生 System.DllNotFoundException
  • 创建了跨平台共享 C++(我认为这是 NDK 中的)库项目,但仍然遇到同样的问题 - DllNotFoundException

代码:

  1. 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;
    }
    }
  2. 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();

    }

项目结构

project structure

引用的教程/代码

https://blog.xamarin.com/build-and-debug-c-libraries-in-xamarin-android-apps-with-visual-studio-2015/

https://blogs.msdn.microsoft.com/vcblog/2015/02/23/developing-xamarin-android-native-applications/

最佳答案

我花了很多时间和测试后才发现这个问题。

为了加载库,C++ 应该打包为 .so Android 中的(共享对象)扩展。

此文件必须打包并放在 .apk 内机器人的。

  • 创建并编译 Xamarin C++ 跨平台共享库项目。
  • 编译 Android 特定的链接项目以获得不同的体系结构.so : x86 , x64 , ARM, ARM64 - 这些对应于不同的 ABI也是。
  • 将 .so 与 android ABI 链接

    1. 选项 1:创建 lib/abi_name文件夹并将 .so 文件设置为 AnroidNativeLibrary其中 abi_name可以

      • 武器
      • armeabi-v7a
      • arm64-v8a
      • x86
      • x86_64
        重要提示:为了将 .so 文件复制到 APK 文件夹结构应该与上面完全相同。如果设备支持的架构是 arm64-v8a,但只创建了 x86 文件夹,那么 .so 文件在 APK 中将不可用,我们仍然会收到 DllNotFoundException。
    2. 选项 2:使用 Build 操作将 .so 文件添加到 android 项目中 AndroidNativeLibrary<ABI>标签说明符。在 Android .csproj 文件中添加如下内容。

      <ItemGroup>
      <AndroidNativeLibrary Include="path/to/libFile.so">
      <Abi>armeabi</Abi>
      </AndroidNativeLibrary>

我已经添加了 Github 存储库 XamarinNDKSample为此,如果有人想要工作代码。

关于c# - 如何从 Xamarin Forms 项目调用 C++ 库代码 - DllNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52173245/

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