Xamarin Android应用中ONNX Runtime SO文件未正确打包导致DllNotFoundException的问题求助
Xamarin Android应用中ONNX Runtime SO文件未正确打包导致DllNotFoundException的问题求助
我最近在做Xamarin Android应用,想把自己的机器学习模型集成进去,用的是C# .NET,测试环境是VS2022自带Android设备管理器创建的模拟器。我已经安装了Microsoft.ML.OnnxRuntime和Microsoft.ML.OnnxRuntime.Managed这两个NuGet包,也把模型转成了ONNX格式并作为资源添加到项目中,但运行时还是碰到了System.DllNotFoundException错误,提示找不到onnxruntime相关的程序集。
错误详情
System.DllNotFoundException Message=onnxruntime assembly:<unknown assembly> type:<unknown type> member:(null) [External Code] > 0xA in MyProjectXamarin.MyProjectModel..ctor at D:\workspace\xamarin-demo\MyProjectXamarin\MyProjectXamarin\MyProjectXamarin\MyProjectModel.cs:21,13 C# 0x95 in MyProjectXamarin.MyProjectModel.CreateFromResources at D:\workspace\xamarin-demo\MyProjectXamarin\MyProjectXamarin\MyProjectXamarin\MyProjectModel.cs:212,13 C# 0x22D in MyProjectXamarin.TrackerDemoPage.InitializeDemo at D:\workspace\xamarin-demo\MyProjectXamarin\MyProjectXamarin\MyProjectXamarin\TrackerDemoPage.cs:148,17 C# 0x3AD in MyProjectXamarin.Droid.AndroidImageSequenceService.LoadImageAsync at D:\workspace\xamarin-demo\MyProjectXamarin\MyProjectXamarin\MyProjectXamarin.Android\AndroidImageSequenceService.cs:94,9 C#
错误发生在MyProjectModel类的第21行,对应代码如下:
12 public class MyProjectModel 13 { 14 private readonly InferenceSession _backboneSession; 15 private readonly InferenceSession _headSession; 16 private NDArray _zf; // Template feature 17 18 public MyProjectModel(byte[] backboneModel, byte[] headModel) 19 { 20 // Create ONNX inference sessions 21 _backboneSession = new InferenceSession(backboneModel); // 错误触发行 22 _headSession = new InferenceSession(headModel); 23 }
排查过程
- 我用7-Zip打开自己应用的APK,进入
**lib\arm64-v8a\**目录,发现里面没有任何onnxruntime相关的.so文件; - 我克隆了官方的ONNX Xamarin示例项目,编译部署到同一个模拟器上能正常运行,打开它的APK后,在同样的
**lib\arm64-v8a\**目录下能看到libonnxruntime.so和libonnxruntime4j_jni.so这两个文件。
尝试过的临时解决方法
我把示例APK里的libonnxruntime.so和libonnxruntime4j_jni.so提取出来,添加到自己的项目中,并且在属性里把它们的Build Action设置为AndroidNativeLibrary。重新打包后,APK里确实出现了这两个文件,但运行时还是报一模一样的DllNotFoundException错误,完全没解决问题。
项目配置相关片段
以下是我项目.csproj中资源和NuGet包的配置:
<ItemGroup> <EmbeddedResource Include="Resources\models\myproject_backbone.onnx" /> <EmbeddedResource Include="Resources\models\myproject_head.onnx" /> </ItemGroup> <ItemGroup> <PackageReference Include="Microsoft.ML.OnnxRuntime" Version="1.22.1" /> <PackageReference Include="NumSharp" Version="0.30.0" /> <PackageReference Include="SkiaSharp" Version="2.88.9" /> <PackageReference Include="SkiaSharp.Views.Forms" Version="2.88.9" /> <PackageReference Include="Xamarin.Forms" Version="5.0.0.2196" /> <PackageReference Include="Xamarin.Essentials" Version="1.7.0" /> </ItemGroup> 我现在是Xamarin开发的新手,而且很久没碰.NET开发了,实在搞不懂哪里出问题了,有没有大佬能指点一下? 内容来源于stack exchange




