Ошибки при попытке создать Xamarin Android binding Java Библиотека для mapsforge / vtm - PullRequest
0 голосов
/ 07 апреля 2020

Я пытался использовать библиотеку карт Java mapsforge-vtm для отображения автономной карты с использованием файла mapsforge с Xamarin Android.

В Visual Studio 2019 я создал один aar binding проект как «LibraryProjectZip» для файла «vtm- android -0.13.0.aar» и один jar binding project as » EmbeddedJar "для файла " vtm- android -0.13.0.jar ".

Также существует зависимость от " vtm-0.13.0.jar ", который вы можете увидеть в файле "vtm- android -0.13.0.pom" .

Этот файл "vtm-0.13.0.jar", кажется, вызывает проблемы (например, java интерфейс Gesture, который я включил ниже).

Если вы продолжаете следовать зависимостям (просматривая файлы pom), есть также зависимости для "slf4j-api -1.7.28.jar " и " androidsvg-1.4.jar " но, насколько я могу судить, эти две банки не вызывают проблем.

Относительно У меня есть проблемный файл "vtm-0.13.0.jar" пытался использовать его как «EmbeddedReferenceJar» в обоих вышеупомянутых проектах (то есть, проекты aar binding и jar binding для vtm- android). Оба эти двух связывающих проекта могут быть построены без ошибок (при использовании «androidsvg-1.4.jar» и «slf4j-api-1.7.28.jar» как «EmbeddedReferenceJar»)

Однако при попытке ссылаться на эти проекты из приложения Xamarin Android, оно не работает.

При попытке сделать это я не могу ссылаться как на проекты aar binding, так и на jar binding, потому что тогда появляется сообщение об ошибке дублированные версии, например, класса "Org.Oscim. Android .MapView". Но когда я использую только один из них (т.е. проект aar или jar), тогда доступны только типы из основных библиотек (то есть файл "LibraryProjectZip" для "vtm- android -0.13.0.aar" и " EmbeddedJar "файл для" vtm- android -0.13.0.jar ").

Но я, похоже, НЕ могу ссылаться на любые типы из" EmbeddedReferenceJar ".

Например , в "vtm-0.13.0.jar" есть java тип "org.oscim.tiling.source.mapfile.MapFileTileSource", но он, кажется, не становится доступным, т.е. я НЕ могу использовать:

using Org.Oscim.Tiling.Source.Mapfile.MapFileTileSource;

Фактически, единственное пространство имен, которое я могу использовать, начиная с "Org.Oscim", это "Org.Oscim. Android", например, это работает:

using Org.Oscim.Android;

Затем я попытался создать отдельный "EmbeddedJar" из файла "vtm-0.13.0.jar", так как я надеялся, что на него потом можно будет ссылаться из Visual Studio. (и в этом проекте я добавил "slf4j-api-1.7.28.jar" как "EmbeddedReferenceJar")

Однако компиляция завершилась с 85 ошибками. И я попробовал все четыре комбинации настроек для «Android Class Parser» и «Android Codegen Target» (т.е. четыре комбинации «class-parse + XAJavaInterop1» и «jar2 xml + XAJavaInterop1» и «class»). -parse + Xamarin Android "и" jar2 xml + Xamarin Android ")

Я также пробовал с несколькими различными целевыми фреймворками (Android 4.4 и Android 9 и Android 10).

50 из этих 85 ошибок - это та же ошибка: Ошибка CS0234 Тип или имя пространства имен 'IGesture' не существует в пространстве имен 'Org.Oscim.Event' (вы пропустили сборку ссылка?) vtm-jar ... \ obj \ Debug \ generate \ src \ Org.Oscim.Event.IGesture.cs

Действительно, при поиске в этом файле "IGesture.cs" интерфейс не определен там. Я ожидал найти что-то вроде "publi c частичный интерфейс IGesture ..." в этом файле, аналогично тому, как есть "publi c частичный интерфейс IGestureListener ..." в файле "IGestureListener.cs "в том же каталоге.

Я подозреваю, что это как-то связано с тем, что java интерфейс" Жест "кажется немного необычным и поэтому не очень хорошо поддерживается Xamarin / Visual Studio.

Это то, о чем я говорю: вот «нормальный» тип интерфейса Java (GestureListener), который в Visual Studio работает без ошибок: https://github.com/mapsforge/vtm/blob/master/vtm/src/org/oscim/event/GestureListener.java

package org.oscim.event;
public interface GestureListener {
    boolean onGesture(Gesture g, MotionEvent e);
}

Вот исходный код проблемного интерфейса c (Gesture) в "vtm-0.13.0.jar": https://github.com/mapsforge/vtm/blob/master/vtm/src/org/oscim/event/Gesture.java

package org.oscim.event;
public interface Gesture {

    final class Press implements Gesture {
    }

    final class LongPress implements Gesture {
    }

    final class Tap implements Gesture {
    }

    final class DoubleTap implements Gesture {
    }

    final class TripleTap implements Gesture {
    }

    final class TwoFingerTap implements Gesture {
    }

    Gesture PRESS = new Press();
    Gesture LONG_PRESS = new LongPress();
    Gesture TAP = new Tap();
    Gesture DOUBLE_TAP = new DoubleTap();
    Gesture TRIPLE_TAP = new TripleTap();
    Gesture TWO_FINGER_TAP = new TwoFingerTap();
}

Насколько Я помню, я не думаю, что когда-либо видел такой код Java с классами, которые определяются и создаются в интерфейсе. И я полагаю, что Xamarin / Visual Studio также трудно понять, такого рода код Java.

Итак, есть ли что-нибудь, что вы можете с этим сделать (и все другие ошибки сборки, всего 85, с это библиотека vtm)?

Кто-нибудь смог реализовать приложение Android с Xamarin Android, которое использует привязки mapsforge-vtm, включая также возможность собрать все части вместе и успешно отобразить карта из файла карты mapsforge?

...