【问题标题】:Xamarin.Android Dynamic Shared Library ABIs missing (System.DllNotFoundException)Xamarin.Android 动态共享库 ABI 缺失 (System.DllNotFoundException)
【发布时间】:2016-12-09 16:42:53
【问题描述】:

我目前正在开发一个使用现有 C 库的 Android 应用。这是一个 Xamarin.Android 应用程序。 我在解决方案中添加了一个动态共享库 (Android) 项目,并从主 Android 项目中引用了它。但我不知道如何让应用程序与本机库一起工作。

当我尝试调用本机函数时,总是收到以下异常 (System.DllNotFoundException):

12-09 17:24:36.390 E/mono-rt ( 3833): [ERROR] FATAL UNHANDLED EXCEPTION: System.DllNotFoundException: mynativelib

当我调试应用程序时,我可以看到.apk 中的libs 下的armeabi-v7a 文件夹中有一个libmynativelib.so。我为armeabiarmeabi-v7ax86 构建应用程序。

日志显示以下行:

12-09 17:24:29.881 D/Mono    ( 3833): DllImport error loading library './libmynativelib': 'dlopen failed: library "/data/app/com.meiglets.myapp-1/lib/arm/./libmynativelib" not found

我假设设备将在 arm-v7a 或类似文件夹中查找库。此外,我认为Visual Studio为每个平台构建了本机库并将其放在libs下的相应目录中。但事实并非如此。

我正在摩托罗拉 Moto G2 XT1068 (Android 6.0 - API 23) 上运行/调试应用程序。

关于 IDE 和版本的一些信息:

  • Microsoft Visual Studio 社区 2015
    • 版本 14.0.25431.01 更新 3
  • Microsoft .NET 框架
    • 版本 4.6.01586
  • 用于跨平台移动开发 (Android) 的 Visual C++
    • 14.0.25401.00
  • Xamarin
    • 4.2.1.64 (872717c)
  • Xamarin.Android
    • 7.0.2.37 (ce955cc)

如果您能帮我弄清楚如何让应用运行,我将不胜感激。

【问题讨论】:

  • 将您的三个 .so 库添加到 Xamarin.Android 项目中,每个库都有自己的 ABI 目录 (lib/{ABI}/nameOfLib.so),并将构建类型设置为 AndroidNativeLibrary(或 EmbeddedNativeLibrary,如果这是一个库项目),然后path sniffing 将找到正确的.so 来加载。
  • 这是一个我也想调试的库项目,因此它是从 Xamarin.Android 项目中引用的。无论如何,我仍然无法弄清楚如何为每个 ABI 构建本机库
  • 您知道armeabi-v7a 库不会加载到非armv7 armeabix86 设备上,对吧?这可能是您的无效 abi 错误的根本原因。
  • 是的,我知道。摩托罗拉 Moto G2 是一个armeabi-v7a,armeabi 设备,并且有一个带有libmynativelib.soarmeabi-v7a 目录,但我仍然得到DLLNotFoundExecption

标签: android xamarin visual-studio-2015 android-ndk xamarin.android


【解决方案1】:

将只安装一个受支持架构的.so 文件。因此,它要么全部包含,要么不包含。你不应该混合这个,否则你会遇到很多像你遇到的问题。

一个常见的错误是没有为所有人提供ABIs,而只是为您提供了设备。我什至见过只提供armeabi libs 而没有其他人的人。要获得设备支持的 ABI 的正确排序列表,请使用 Build.SupportedAbis

https://developer.xamarin.com/api/property/Android.OS.Build.SupportedAbis/

其次,通过安装类似 Native Libs Monitor 的帮助应用程序确保 lib 将其用于设备:

https://play.google.com/store/apps/details?id=com.xh.nativelibsmonitor.app

如果库没有进入设备,那么您需要确保在.so 文件上设置了正确的Build Action

要使用 Xamarin.Android 库项目部署本机库,请将库二进制文件添加到项目并将其构建操作设置为 EmbeddedNativeLibrary。

来源: https://developer.xamarin.com/guides/android/advanced_topics/using_native_libraries/

【讨论】:

  • 我已经接受了这个答案,尽管这并不是问题所在!我在本机库项目中使用libgmp,忘记将预构建的libgmp 文件添加到lib/{ABI}/libgmp.so 下的android 项目中。无论如何,这个答案让我注意到这个问题
猜你喜欢
  • 2021-03-21
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多