Android Spatialite {j}中的jsqlite.Database.internal_init中的java.lang.UnsatisfiedLinkError

时间:2016-03-29 01:57:03

标签: android sqlite android-ndk java-native-interface spatialite

我是开发Android和使用Spatialite的新手,并且无法弄清楚为什么我的应用因为这个错误而在一些设备上崩溃:

java.lang.UnsatisfiedLinkError:找不到void jsqlite.Database.internal_init()的实现(尝试过Java_jsqlite_Database_internal_1init和Java_jsqlite_Database_internal_1init__)     at jsqlite.Database.internal_init(Native Method)     在jsqlite.Database。(Database.java:25)

此崩溃报告来自Android 6.0的Nexus 5(锤头),但已在Xoom上报告了Android 4.1和其他一些未知设备。我认为它可能与这些问题中提到的NDK版本有关:

Adding ".so" library to my android studio project
Android NDK java.lang.UnsatisfiedLinkError: findLibrary returned null https://bitbucket.org/almworks/sqlite4java/issues/71/arm64-bit。 (虽然这是针对sqlite4java)

除此之外,我还收到此错误/警告(取决于设备):libjsqlite.so具有文本重定位。这会浪费内存并防止安全性增强。请修理。虽然它不像其他错误那样使应用程序崩溃。

2 个答案:

答案 0 :(得分:5)

我通过设置应用built.gradle(或在AndroidManifest.xml中)解决了这个问题:

targetSdkVersion 21

它有效! 我知道这不是一个好的解决方案,它是一个补丁,但我的工作!

*** UPDATE

如果您无法将目标版本更改为21,则可以执行以下操作:

  • 从以下网址下载源代码:https://github.com/geopaparazzi/geopaparazzi
  • 将项目中的所有引用清除为spatialite,.war文件和jndi库
  • 复制模块geopaparazzispatialitelibrary并集成到您的项目中
  • 清除模块中不需要的代码
  • 编译,享受您的项目定位版本23

这是一个复杂的过程,但它确实有效。

特别感谢andrea antonello,他帮助我解决了这个问题,并且在使用spaceite时做得非常好。

答案 1 :(得分:1)

如果这可以帮助任何有同样问题的人,我通过更新jni库解决了这个问题。为此,我下载了这个文件:

https://github.com/geopaparazzi/libjsqlite-spatialite-android/blob/master/archive/20150616.libjsqlite.4.3.0.tar.bz2

来自geopaparazzi github repo,其中包含截至目前的最新版本的jni库。

将spatialiteandroid库中的.so文件替换为存档文件中的文件。

您可以在此处找到该库的所有版本:https://github.com/geopaparazzi/libjsqlite-spatialite-android/tree/master/archive