我想将 h3 java 绑定库集成到我的 android 应用程序中,但出现以下异常:
java.lang.UnsatisfiedLinkError:在 com.uber.h3core.H3CoreLoader.copyResource(H3CoreLoader.java:67) 的 /android-armv7l/libh3-java.so 中找不到本机资源
有没有人在Android OS 之前使用过这个库?
谢谢你。
最初,按照他们的自述文件中看到的预期用法应该可以使它工作。如果没有,请参见下文。
已知问题:Android,无法使用库
UnsatisfiedLinkError
:当项目中没有复制/检测到相应的原生库时,可能会遇到这种情况。遵循NickRadu 的解决方法应该可以使其正常工作。以下是分步指南。
jniLibs
(app/src/main/jniLibs
)(出于某种原因,仅将其命名jni
对我不起作用)。android-
并将它们插入jniLibs
文件夹中(从步骤 1 开始)。android-
前缀。splits { abi { enable false } }
到您应用的 build.gradle 文件(在 内android
)。完毕。一般来说,图书馆现在应该按预期工作。
如果在应用安装过程中遇到:
INSTALL_FAILED_NO_MATCHING_ABIS
,然后根据您的测试设备,创建文件夹的副本(连同其内容)并根据需要重命名。例如,在 arm64-v8a 上运行的设备,我只是复制了该arm64
文件夹并将其重命名为arm64-v8a
. 或者,如果您使用的是模拟器,请确保您使用的不是带有x86
CPU 的模拟器。
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
。
另请注意,如果不对代码进行一些修改,该库将无法在 Android api < 26 上运行。H3Core 依赖的将十六进制 long 解析为十六进制字符串 Long.parseUnsignedInt 的函数直到 api 26 才添加到 Android Java 中。