Skapa uppräkningar

Det finns fall där Java Android-bibliotek använder heltalskonstanter för att representera tillstånd som skickas till bibliotekens egenskaper eller metoder. För brett distribuerade bindningar kan det vara bra att binda dessa heltalskonstanter till uppräkningar i C# för att tillhandahålla ett snyggare API för konsumenter.

För interna eller låga användningsbindningar är det vanligtvis inte värt att konfigurera dessa, eftersom konsumenterna helt enkelt kan använda de bundna konstanterna i stället för en uppräkning.

För att underlätta den här mappningen läggs två filer till i bindningsprojekt som standardprojektmall:

  • EnumFields.xml – Den här filen definierar mappningen mellan Java-heltalskonstanter och en C#-uppräkning

  • EnumMethods.xml – Den här filen definierar vilka metoder/egenskaper som för närvarande tar en int metodparameter eller har en int returtyp som ska ändras för att använda en uppräkning i stället.

Definiera en uppräkning med hjälp av EnumFields.xml

Filen EnumFields.xml innehåller mappningen mellan Java-konstanter int och C# enums. Nu ska vi ta följande exempel på en C#-uppräkning som skapas för en uppsättning konstanter int:

<mapping jni-class="com/skobbler/ngx/map/realreach/SKRealReachSettings" clr-enum-type="Skobbler.Ngx.Map.RealReach.SKMeasurementUnit">
    <field jni-name="UNIT_SECOND" clr-name="Second" value="0" />
    <field jni-name="UNIT_METER" clr-name="Meter" value="1" />
    <field jni-name="UNIT_MILIWATT_HOURS" clr-name="MilliwattHour" value="2" />
</mapping>

Här har vi tagit Java-klassen SKRealReachSettings och definierat en C#-uppräkningstyp som heter SKMeasurementUnit i namnområdet Skobbler.Ngx.Map.RealReach. Posterna field definierar namnet på Java-konstanten (exempel UNIT_SECOND), namnet på uppräkningsposten (exempel Second) och heltalsvärdet som representeras av båda entiteterna (till exempel 0).

Definiera metoder för getter/setter med hjälp av EnumMethods.xml

Med EnumMethods.xml-filen kan du ändra metodparametrar och returnera typer från Java-konstanter int till C# enums. Med andra ord mappas läsning och skrivning av C#-uppräkningar (definieras i EnumFields.xml-filen ) till Java-konstant intget och set -metoder.

Med tanke på den SKRealReachSettings uppräkning som definierats ovan skulle den följande EnumMethods.xml-filen definiera `getter`/`setter` för den här uppräkningen:

<mapping jni-class="com/skobbler/ngx/map/realreach/SKRealReachSettings">
    <method jni-name="getMeasurementUnit" parameter="return" clr-enum-type="Skobbler.Ngx.Map.RealReach.SKMeasurementUnit" />
    <method jni-name="setMeasurementUnit" parameter="measurementUnit" clr-enum-type="Skobbler.Ngx.Map.RealReach.SKMeasurementUnit" />
</mapping>

Den första method raden mappar returvärdet för Java-metoden getMeasurementUnit till SKMeasurementUnit uppräkningen. Den andra method raden mappar den första parametern för setMeasurementUnit till samma uppräkning.

Med alla dessa ändringar på plats kan du använda följande kod i .NET för Android för att ange MeasurementUnit:

realReachSettings.MeasurementUnit = SKMeasurementUnit.Second;