Xamarin.Android动态共享库ABI丢失(System.DllNotFoundException)

时间:2016-12-09 16:42:54

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

我目前正在开发一款使用现有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

当我调试应用程序时,我可以看到libmynativelib.soarmeabi-v7a下的libs文件夹中有一个.apk。我为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 Framework
    • 版本4.6.01586
  • 用于跨平台移动开发的Visual C ++(Android)
    • 14.0.25401.00
  • Xamarin
    • 4.2.1.64(872717c)
  • Xamarin.Android
    • 7.0.2.37(ce955cc)

如果你能帮助我弄清楚如何让应用程序运行,我真的很感激。

1 个答案:

答案 0 :(得分:1)

仅安装支持的体系结构的一个.so文件。因此,它包括全部或不包括在内。你不应该混合这个,否则你会遇到很多问题,比如你遇到过的问题。

一个常见的错误是没有ABI为所有人,而只是你拥有设备的那个。我甚至看到那些只提供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

如果库未将其设置为设备,则需要确保在Build Action文件上设置了正确的.so

  

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

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