Xamarin Android绑定Java库:嵌套枚举转C#枚举失败求助
解决Xamarin绑定Java嵌套枚举为C#枚举的问题
核心问题分析
你当前的配置错误在于嵌套枚举的JNI类名路径——Java中嵌套类(包括枚举)的JNI签名需要用$连接外层类与嵌套类,而非直接写嵌套类名。原配置里的com/cloudipsp/android/Status是错误的,正确路径应该是com/cloudipsp/android/Receipt$Status。同时C#中嵌套类型用+分隔,所以CLR枚举类型也要对应调整。
步骤1:修正EnumFields.xml配置
将原配置中的JNI类路径和CLR枚举类型修改为嵌套类的正确格式:
<enum-field-mappings> <mapping jni-class="com/cloudipsp/android/Receipt$Status" clr-enum-type="Com.Cloudipsp.Android.Receipt+Status"> <field jni-name="created" clr-name="Created" value="0" /> <field jni-name="processing" clr-name="Processing" value="1" /> <field jni-name="declined" clr-name="Declined" value="2" /> <field jni-name="approved" clr-name="Approved" value="3" /> <field jni-name="expired" clr-name="Expired" value="4" /> <field jni-name="reversed" clr-name="Reversed" value="5" /> </mapping> </enum-field-mappings>
注意:CLR枚举成员名建议遵循C# PascalCase命名规范,所以把小写的created改成Created,以此类推。
步骤2:确保Receipt类的status字段被生成
如果修正枚举映射后status字段仍未生成,需要在Metadata.xml中添加配置,强制绑定工具识别该字段:
<metadata> <attr path="/api/package[@name='com.cloudipsp.android']/class[@name='Receipt']/field[@name='status']" name="managedType">Com.Cloudipsp.Android.Receipt+Status</attr> </metadata>
这段配置会明确告诉绑定工具,Receipt类的status字段对应C#的Receipt.Status枚举类型。
步骤3:清理并重新构建项目
- 删除项目的
obj和bin目录,清理缓存 - 重新生成绑定库
- 检查生成的C#代码:
Receipt类下应该会生成嵌套的Status枚举(而非继承自Java.Lang.Enum的类)Receipt类中会出现Status Status { get; set; }属性
内容的提问来源于stack exchange,提问作者Artem Mishenkov
相关产品推荐
相关产品推荐

