首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从Xamarin窗体项目- DllNotFoundException调用DllNotFoundException库代码

如何从Xamarin窗体项目- DllNotFoundException调用DllNotFoundException库代码
EN

Stack Overflow用户
提问于 2018-09-04 20:00:01
回答 1查看 3.9K关注 0票数 4

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

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

  • 我在Debug文件夹中复制了.dll和其他文件(当前项目试图引用DLL )。(我引用了这个https://www.youtube.com/watch?v=V5hZRtSB-2Q,它适用于C#控制台)
  • 即使尝试添加对DLL文件的引用,也不能添加文件。
  • 将C++ DLL项目添加到相同的解决方案中并引用它将给出System.DllNotFoundException
  • 创建跨平台共享C++ (我认为这是在NDK)库项目,但仍然有相同的问题- DllNotFoundException

代码:

  1. C++ #包括"stdafx.h“extern "C"{ __declspec(dllexport) int相加( int a,int b) {返回a+ b;} __declspec(dllexport) int减(int a,int b) {返回a- b;}}
  2. App.xaml.cs或任何其他.Net标准共享项目 公共部分类应用程序:应用程序{ DllImport("Dll1.dll",CallingConvention = CallingConvention.Cdecl)公共静态导出int减法( int a,int b);DllImport("Dll1.dll",CallingConvention = CallingConvention.Cdecl)公共静态表达式添加( int a,int b);DllImport("XamCppDll.Shared.so")公共静态extern int cpp_GetValue(int a,int b);public App ( int a,int b);int x= 100;int y= 15;int z= 0;int z1 = 0;尝试{ cpp_GetValue(5,6);//XamCppDll.Shared.soz=减法( 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 =新MainPage();} }

项目结构

参考教程/代码

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/

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-06 17:53:32

在花了这么多时间和测试之后,我发现了这个问题。

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

这个文件必须打包并放置在安卓的.apk中。

  • 创建并编译Xamarin C++跨平台共享库项目。
  • 编译特定于Android的链接项目,得到不同的体系结构.so : x86、x64、ARM、ARM64 --它们也对应于不同的ABI。
  • 将.so与android连接起来
代码语言:javascript
复制
1. **Option 1** : create `lib/abi_name` folder and set .so file as `AnroidNativeLibrary` where `abi_name` can be
代码语言:javascript
复制
    - armeabi
    - armeabi-v7a
    - arm64-v8a
    - x86
    - x86\_64

重要注意事项:为了将.so文件复制到APK文件夹结构中,应该与上面完全相同。如果设备支持的体系结构是arm64-v8a,但是只创建了x86文件夹,那么.so文件将在APK中不可用,我们仍然可以得到DllNotFoundException。

代码语言:javascript
复制
1. **Option 2**: Add .so file into android project with Build action `AndroidNativeLibrary` with `<ABI>` tag specifier. In Android .csproj file add as below.

armeabi

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52173245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档