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

Pra*_*eek 5 c# c++ xamarin.android xamarin.forms

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

那么必须在哪里复制或引用 DLL 文件才能使其发挥作用呢?

  • 我已经复制了.dllDebug 文件夹中的其他文件(当前项目正在尝试引用 DLL。(我引用了此视频,它适用于 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;
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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();
    
    }
    
    Run Code Online (Sandbox Code Playgroud)

    }

项目结构

项目结构

参考教程/代码

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/

Pra*_*eek 4

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

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

该文件必须打包并放置在.apkandroid.app 中。

  • 创建并编译 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. 选项 2AndroidNativeLibrary :使用带有标签说明符的 Build 操作将 .so 文件添加到 android 项目中<ABI>。在 Android .csproj 文件中添加如下内容。

      <ItemGroup>
      <AndroidNativeLibrary Include="path/to/libFile.so">
          <Abi>armeabi</Abi>
      </AndroidNativeLibrary>
      
      Run Code Online (Sandbox Code Playgroud)

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