Android JNI,有什么办法可以直接读取应用程序的sqlite数据库?

时间:2010-09-22 16:30:16

标签: android sqlite java-native-interface

我正在通过JNI开发一个带有Java组件和C ++组件的Android应用程序。 C ++组件用于其他平台。

如果C ++组件可以查询现有的SQLite数据库(通过SQLite C API),而不必将调用发送到Java端,那将使我的生活变得更加轻松。

我知道这是一个很长的镜头,有没有人尝试过这个?

3 个答案:

答案 0 :(得分:2)

不,NDK仅提供有限的api。唯一正式支持的领域是:

  • libc(C库)标题
  • libm(数学库)标题
  • JNI接口标题
  • libz(Zlib压缩)标题
  • liblog(Android日志记录)标题
  • OpenGL ES 1.1和OpenGL ES 2.0(3D图形库)标题
  • libjnigraphics(像素缓冲区访问)标头(适用于Android 2.2和 上文)。
  • C ++支持的最小标头集

来自ndk docs

答案 1 :(得分:1)

如果您不需要从java访问数据库,那么就Android而言,它只是您有权访问的目录中的文件。通过平台的libsqlite.so和经过批准的java包装器访问它是一种方法,但是如果你真的想要的话,绝对没有什么能阻止你使用你自己的sqlite实现来操作你自己的文件。

因为它是你自己的实现(可能是基于当前平台的副本),所以你在技术上并没有滥用私有api,因为即使平台的版本以不兼容的方式发展,你也可以控制你自己的副本的演变

如果您想优化软件包大小,可以先“评估”平台的libsqlite.so,以决定是否可以使用它,如果没有从服务器下载自己的版本。在我的设备上它只有大约300K。但是,这也依赖于其他非ndk库,因此完全遵循nkd“规则”的版本可能会稍微大一点,因为它需要复制其他一些东西,比如libutils等。

那么问题是你是否更好:

  • 通过jni回拨(“android方式”)
  • 使用您自己的实现(安全但很麻烦创建)
  • 滥用现有的库,只要它有效,如果你无法弄清楚如何适应任何破坏它的变化,那就自己动手吧

答案 2 :(得分:0)

尝试将此自定义NDK与标准C ++库支持http://www.crystax.net/android/ndk-r4.php

一起使用