【发布时间】: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。我为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 和版本的一些信息:
- 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库不会加载到非armv7armeabi和x86设备上,对吧?这可能是您的无效 abi 错误的根本原因。 -
是的,我知道。摩托罗拉 Moto G2 是一个
armeabi-v7a,armeabi设备,并且有一个带有libmynativelib.so的armeabi-v7a目录,但我仍然得到DLLNotFoundExecption
标签: android xamarin visual-studio-2015 android-ndk xamarin.android