Xamarin Android集成Google ARCore Sceneform SDK遇方法缺失错误求助
解决Xamarin Android中ARCore Sceneform的Java.Lang.NoSuchMethodError问题
这个Java.Lang.NoSuchMethodError错误通常是因为Sceneform绑定库与ARCore SDK版本不匹配,或者是你调用SetSource的方式不符合Xamarin绑定库的方法签名导致的。下面是具体的解决步骤:
1. 检查NuGet包版本兼容性
Sceneform和ARCore的版本必须严格匹配,否则会出现方法签名不兼容的问题。比如如果你用的是Xamarin.Google.Sceneform 1.17.1,就必须搭配Xamarin.Google.ARCore 1.17.x的版本:
- 打开NuGet包管理器,卸载现有的Sceneform和ARCore包
- 重新安装同一大版本号的兼容包
2. 修正ModelRenderable的加载代码
在Xamarin的Sceneform绑定中,直接传入资源ID的SetSource重载可能没有正确映射,建议通过Android.Net.Uri来加载Raw目录下的模型资源,修改你的代码如下:
// 替换原来的ModelRenderable构建代码 var modelUri = Android.Net.Uri.Parse($"android.resource://{PackageName}/{Resource.Raw.andy}"); ModelRenderable.InvokeBuilder() .SetSource(this, modelUri) .Build((renderable, error) => { if (error != null) { // 增加错误处理,方便排查问题 System.Diagnostics.Debug.WriteLine($"模型加载失败: {error.Message}"); return; } andyRenderable = renderable; });
另外注意,Build方法的回调其实包含两个参数:成功的renderable和失败的throwable,加上错误处理能帮你快速定位加载时的问题,比如模型文件损坏或者资源路径错误。
3. 确认资源文件配置正确
确保你的模型文件(比如andy.sfb)确实放在Resources/Raw目录下,并且在文件属性中把Build Action设置为AndroidResource——只有这样Xamarin才能正确生成对应的资源ID供代码调用。
4. 清理重建项目
有时候项目的编译缓存会导致绑定库的方法签名不生效,执行以下步骤:
- 右键解决方案 → 选择Clean Solution
- 然后右键解决方案 → 选择Rebuild Solution
修改后的完整OnCreate示例代码
protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); Xamarin.Essentials.Platform.Init(this, savedInstanceState); if (!CheckIsSupportedDeviceOrFinish(this)) { return; } SetContentView(Resource.Layout.activity_main); // 请求相机权限 string cameraPermission = Android.Manifest.Permission.Camera; if (ContextCompat.CheckSelfPermission(this, cameraPermission) != (int)Permission.Granted) { ActivityCompat.RequestPermissions(this, new[] { cameraPermission }, 0); } arFragment = (ArFragment)SupportFragmentManager.FindFragmentById(Resource.Id.ux_fragment); // 修正后的ModelRenderable加载逻辑 var modelUri = Android.Net.Uri.Parse($"android.resource://{PackageName}/{Resource.Raw.andy}"); ModelRenderable.InvokeBuilder() .SetSource(this, modelUri) .Build((renderable, error) => { if (error != null) { System.Diagnostics.Debug.WriteLine($"加载模型出错: {error.Message}"); return; } andyRenderable = renderable; }); arFragment.TapArPlane += OnTapArPlane; }
内容的提问来源于stack exchange,提问作者Suresh Kumar
相关产品推荐
相关产品推荐

