6

我想将 h3 java 绑定库集成到我的 android 应用程序中,但出现以下异常:

java.lang.UnsatisfiedLinkError:在 com.uber.h3core.H3CoreLoader.copyResource(H3CoreLoader.java:67) 的 /android-armv7l/libh3-java.so 中找不到本机资源

有没有人在Android OS 之前使用过这个库?

谢谢你。

4

2 回答 2

3

最初,按照他们的自述文件中看到的预期用法应该可以使它工作。如果没有,请参见下文。

已知问题:Android,无法使用库

UnsatisfiedLinkError:当项目中没有复制/检测到相应的原生库时,可能会遇到这种情况。遵循NickRadu 的解决方法应该可以使其正常工作。以下是分步指南。

  1. 在您的项目 app 文件夹中添加一个 JNI 文件夹并将其重命名jniLibsapp/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,然后根据您的测试设备,创建文件夹的副本(连同其内容)并根据需要重命名。例如,在 arm64-v8a 上运行的设备,我只是复制了该arm64文件夹并将其重命名为arm64-v8a. 或者,如果您使用的是模拟器,请确保您使用的不是带有x86CPU 的模拟器。

  • D8 errors: Invoke-customs are only supported starting with Android O (--min-api 26),在您的应用程序的 build.gradle 中添加这些编译选项(在android-- 请注意,它可能会根据您系统的 Java 版本而改变)

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    

注意:最好先在多种 CPU 架构类型上测试应用程序以查看其行为。

要快速查看设备的 CPU 架构,您可以安装Droid Hardware Info或自己运行快速测试代码

这是我使用的一个测试块及其相应的结果日志:

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

我制作了一个示例项目,该库按预期工作。见android-uber-h3-sample

于 2019-07-15T08:59:38.333 回答
1

另请注意,如果不对代码进行一些修改,该库将无法在 Android api < 26 上运行。H3Core 依赖的将十六进制 long 解析为十六进制字符串 Long.parseUnsignedInt 的函数直到 api 26 才添加到 Android Java 中。

于 2019-07-15T12:38:30.170 回答