Android Spatialite中jsqlite.Database.internal_init中的java.lang.UnsatisfiedLinkError

Jis*_*ike 4 sqlite java-native-interface android spatialite android-ndk

我刚开始使用Android并使用Spatialite而无法弄清楚为什么我的应用程序因为这个错误而在一些设备上崩溃:

java.lang.UnsatisfiedLinkError:在jsqlite.Database的jsqlite.Database.internal_init(本机方法)中找不到void jsqlite.Database.internal_init()(尝试过Java_jsqlite_Database_internal_1init和Java_jsqlite_Database_internal_1init__)的实现.(Database.java:25)

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

将".so"库添加到我的android工作室项目
Android NDK java.lang.UnsatisfiedLinkError:findLibrary返回null https://bitbucket.org/almworks/sqlite4java/issues/71/arm64-bit.(虽然这是针对sqlite4java)

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

Rob*_*erV 5

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

targetSdkVersion 21
Run Code Online (Sandbox Code Playgroud)

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

***UPDATE

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

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

这是一个复杂的过程,但它的工作原理.

特别感谢andrea antonello,他帮助我解决了这个问题,并且做了很好的工作.