You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Xamarin Android应用中ONNX Runtime SO文件未正确打包导致DllNotFoundException的问题求助

Xamarin Android应用中ONNX Runtime SO文件未正确打包导致DllNotFoundException的问题求助

我最近在做Xamarin Android应用,想把自己的机器学习模型集成进去,用的是C# .NET,测试环境是VS2022自带Android设备管理器创建的模拟器。我已经安装了Microsoft.ML.OnnxRuntimeMicrosoft.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.solibonnxruntime4j_jni.so这两个文件。

尝试过的临时解决方法

我把示例APK里的libonnxruntime.solibonnxruntime4j_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

火山引擎 最新活动