代码之家  ›  专栏  ›  技术社区  ›  Morse unmounted

如何从XAMARIN FESTS项目调用C++库代码

  •  2
  • Morse unmounted  · 技术社区  · 7 年前

    我有Xamarin表单跨平台项目-Android、iOS和UWP。我有一个C++ DLL项目,我从其中创建了一个DLL。我的意图是在XAMARIN FrAMS交叉点中集成/调用这些C++代码。我知道如何从C++控制台应用程序调用C++ DLLImport DllNotFoundException

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

    • 我已经抄了 .dll 以及调试文件夹中的其他文件(当前项目尝试引用DLL的位置)。( video 它适用于C#控制台
    • 甚至尝试添加对DLL文件的引用-出现错误无法添加文件
    • 将C++ DLL项目添加到相同的解决方案中并引用它 System.DllNotFoundException .
    • DllNotFoundException异常 .

    代码:

    1. #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. 应用程序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/

    1 回复  |  直到 7 年前
        1
  •  3
  •   Morse unmounted    7 年前

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

    此文件必须打包并放置在 .apk 安卓系统的。

    • 编译特定于Android的链接项目以获得不同的架构 .so:x86、x64、ARM、ARM64-这些对应不同的ABI
    • Link。那么android ABI呢

      1. 方案1 lib/abi_name 文件夹并将.so文件设置为 AnroidNativeLibrary 哪里 abi_name 可以是

        • armeabi-v7a型
        • arm64-v8a系列
        • x86个

        • 重要提示: 为了将.so文件复制到APK文件夹的结构应该与上面的完全相同。如果设备支持的体系结构是arm64-v8a,但是只创建x86文件夹,那么文件在APK中就不可用了,我们仍然会得到DllNotFoundException。
      2. AndroidNativeLibrary 具有 <ABI> 标记说明符。在Android.csproj文件中添加如下内容。

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

    XamarinNDKSample 如果有人想要工作代码。