Android h3: шестиугольная иерархическая система геопространственного индексирования - PullRequest
0 голосов
/ 27 августа 2018

Я хочу интегрировать библиотеку привязки Java h3 в мое приложение для Android, и я получаю следующее исключение:

java.lang.UnsatisfiedLinkError: На /android-armv7l/libh3-java.so не найден собственный ресурс в com.uber.h3core.H3CoreLoader.copyResource (H3CoreLoader.java:67)

Кто-нибудь ранее использовал эту библиотеку для ОС Android?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 15 июля 2019

Также имейте в виду, что библиотека не будет работать на Android API <26 без каких-либо изменений в коде. Функция, на которую опирается H3Core для анализа шестнадцатеричной строки long в hex Long.parseUnsignedInt, не добавлялась в Android Java до API 26. </p>

0 голосов
/ 15 июля 2019

Первоначально, после предполагаемого использования , как видно из их README, оно должно работать.

Gradle:

compile("com.uber:h3:3.4.1")

для Android Studio:

implementation "com.uber:h3:3.4.1"

Кодировать местоположение в адрес шестиугольника:

H3Core h3 = H3Core.newInstance();

lat = 37.775938728915946;
lng = -122.41795063018799;
res = 9;

String hexAddr = h3.geoToH3Address(lat, lng, res);

Декодировать адрес шестиугольника в координаты:

List<GeoCoord> geoCoords = h3.h3ToGeoBoundary(hexAddr);

Если вышеописанное не работает, см. Ниже.

Известная проблема: Android, библиотека не может использоваться

UnsatisfiedLinkError - С этим можно столкнуться, когда соответствующая собственная библиотека не скопирована / обнаружена в проекте. После обходного пути NickRadu должно заработать. Ниже приведено пошаговое руководство.

  1. Добавьте папку JNI в папку приложения вашего проекта и переименуйте ее в jniLibs (app/src/main/jniLibs) (по какой-то причине ее имя jni не работает только для меня).
  2. Получите H3 JAR (убедитесь, что вы используете ту же версию) и извлеките содержимое JAR.
  3. Скопируйте папки с префиксом android- и вставьте их в папку jniLibs (из шага 1).
  4. Переименуйте скопированные папки, удалите префикс android-.
  5. Добавьте splits { abi { enable false } } в файл build.gradle вашего приложения (в пределах android).

Готово. В общем, библиотека должна теперь работать как положено.

Если во время установки приложения вы встретите INSTALL_FAILED_NO_MATCHING_ABIS, затем, в зависимости от вашего test устройства, создайте копию папки (вместе с ее содержимым) и переименуйте ее при необходимости. Например, на устройстве, работающем на arm64-v8a, я просто сделал копию папки arm64 и переименовал ее в arm64-v8a.

Примечание. Лучше всего сначала протестировать приложение на нескольких типах архитектуры ЦП, чтобы увидеть его поведение.

Чтобы быстро увидеть архитектуру процессора устройства, вы можете установить Информация об оборудовании Droid или выполнить быстрый тестовый код самостоятельно.

Вот тестовый блок, который я использовал, и соответствующие ему журналы результатов:

private fun testH3() {
    val h3 = H3Core.newSystemInstance()

    val lat = 37.775938728915946
    val lng = -122.41795063018799
    val resolution = 8

    val hexAddr = h3.geoToH3Address(lat, lng, resolution)
    val hex = h3.stringToH3(hexAddr)
    val kRingsResult = h3.kRings(hexAddr, 1)

    Log.d("H3Test", "geoToH3Address: $hexAddr")
    Log.d("H3Test", "stringToH3: $hex")
    Log.d("H3Test", "kRings: $kRingsResult")
}

Результат:

D/H3Test: geoToH3Address: 8828308281fffff
D/H3Test: stringToH3: 613196570331971583
D/H3Test: kRings: [[8828308281fffff], [8828308281fffff, 882830828dfffff, 8828308285fffff, 8828308287fffff, 8828308283fffff, 882830828bfffff, 8828308289fffff]]
...