Создание перечислений

Существуют случаи, когда библиотеки Java Android используют целые константы для представления состояний, передаваемых свойствам или методам библиотек. Для широко распределенных привязок может потребоваться привязать эти целые константы к перечислениям в C# для предоставления более удобного API для потребителей.

Для внутренних или редко используемых привязок обычно не имеет смысла тратить усилия на их настройку, поскольку разработчики могут просто использовать привязанные константы вместо перечисления.

Чтобы упростить это сопоставление, два файла добавляются в привязку проектов по умолчанию:

  • EnumFields.xml . Этот файл определяет сопоставление между целыми константами Java и перечислением C#.

  • EnumMethods.xml . Этот файл определяет методы и свойства, которые в настоящее время принимают int параметр метода или имеют int тип возвращаемого значения, и должны быть изменены, чтобы использовать перечисление вместо этого.

Определение перечисления с помощью EnumFields.xml

Файл EnumFields.xml содержит сопоставление констант int Java и enums C#. Рассмотрим следующий пример перечисления C#, создаваемого для набора констант 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>

Здесь мы воспользовались классом Java SKRealReachSettings и определили перечисление C# с именем SKMeasurementUnit в пространстве имен Skobbler.Ngx.Map.RealReach. Запись field определяет имя константы Java (например, UNIT_SECOND), имя элемента перечисления (например, Second) и целочисленное значение, представленное обоими элементами (например, 0).

Определение методов геттеров/сеттеров с помощью EnumMethods.xml

Файл EnumMethods.xml позволяет изменять параметры метода и типы возвращаемых значений из констант int Java на enums C#. Другими словами, он сопоставляет чтение и запись перечислений C# (определенных в файле EnumFields.xml) с константами Java int и методами getset.

Учитывая перечисление SKRealReachSettings, заданное выше, файл EnumMethods.xml будет определять геттер/сеттер для этого перечисления:

<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>

Первая строка method сопоставляет возвращаемое значение метода Java getMeasurementUnit с перечислением SKMeasurementUnit. Вторая строка method сопоставляет первый параметр setMeasurementUnit с тем же перечислением.

После всех этих изменений можно использовать следующий код в .NET для Android, чтобы задать MeasurementUnit.

realReachSettings.MeasurementUnit = SKMeasurementUnit.Second;