我目前正在开发一款使用现有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.so
中armeabi-v7a
下的libs
文件夹中有一个.apk
。我为armeabi
,armeabi-v7a
和x86
构建了应用。
日志显示以下行:
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和版本的一些信息:
如果你能帮助我弄清楚如何让应用程序运行,我真的很感激。
答案 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/