构建包含jackson-databind的Xamarin Android Binding Library时出现NullReferenceException
Xamarin Android绑定jackson-databind空引用异常排查方向
- 先补全jackson的全部依赖:jackson-databind正常运行需要同版本的
jackson-core、jackson-annotations两个jar包,将三个包全部放入绑定项目的Jars目录,构建操作统一设置为EmbeddedJar,缺失依赖会导致绑定生成器解析类元数据时读取到不完整信息触发空引用。 - 配置过滤规则排除无法解析的类:在绑定项目的
Transforms/Metadata.xml中先批量排除jackson的非必要类,示例规则如下:
<remove-node path="/api/package[@name='com.fasterxml.jackson.databind']/class[contains(@name, 'Serializer') or contains(@name, 'Deserializer') or contains(@name, 'TypeResolver')]" />
如果过滤后可以正常构建,再逐步放开需要用到的类,缩小范围定位触发异常的具体类。
- 更换类解析器:在绑定项目的.csproj文件中添加配置,强制使用更稳定的class-parse解析器:
<PropertyGroup> <AndroidClassParser>class-parse</AndroidClassParser> </PropertyGroup>
VS2019默认的jar2xml解析器处理高版本Java字节码时极易出现空引用bug。
- 降级jackson版本:不要使用2.14及以上的jackson版本,高版本用到了Java 11+的字节码特性,VS2019配套的Xamarin工具链不支持这类特性,建议降级到2.13.x的LTS版本测试。
- 开启诊断级构建日志定位触发点:在VS的工具→选项→项目和解决方案→生成并运行中,将MSBuild输出详细程度调整为「诊断」,重新构建后搜索最后一次出现
BG0000错误前的日志,就能看到生成器当时正在处理的类名,直接在Metadata.xml中排除该类即可解决问题。
内容的提问来源于stack exchange,提问作者Vladislav Budnikov
相关产品推荐
相关产品推荐

