2011-04-02 135 views
22

是否有可能在Android手机上使用SQLite与C++?我还没有找到任何有关这可能的文档。SQLite与Android NDK

+1

http://code.google.com/p/sqlite-ndk/ - 它包括小例子如何使用SQLite,也sqlite3ndk,您可以访问存储在“资产”目录(2.3+)数据库。您可以直接从sqlite.org使用SQLite,因为源文件没有变化。 – kibab 2011-09-29 15:19:22

回答

13

不可能通过NDK使用内置的SQLite(或者在六个月前,当我研究这个时),只能用Java访问。然而,它可能会链接到你自己完全独立的SQLite的C++版本。

+7

不仅“可能”它的工作,但它确实。我简单地将“sqlite.c”添加到我的项目中:它包含整个数据库 – 2011-04-04 13:38:48

+2

@bitbox:我对这个解决方案很感兴趣,可以提供关于如何处理它的更多细节? – 2011-07-12 05:36:15

1

声明:我只使用这种方法的独立可执行文件,而不是实现JNI函数的库。它可能适用于.so或不适用。另外,我正在使用自定义Android设备,而不是手机。

您可以通过NDK使用内置的SQLite,但它比支持的东西更像是一种破解。您需要从android源码分发中剔除sqlite3.h和libsqlite.so,并使用它们进行编译。将sqlite3.h放入你的应用程序源代码目录中,并且你需要将.so放在out/yourapp目录下,或者在build/platform/android-x/arch-arm/usr/lib目录下完成链接步骤。我在两个地方都有,但我不确定哪一个是真正需要的。

您将最终链接到您提供的libsqlite.so,但二进制将在目标设备上使用系统libsqlite.so正常运行。

43

单从下载SQLite3的合并源文件: http://www.sqlite.org/download.html

然后在Android.mk添加sqlite3.cLOCAL_SRC_FILES变量。

+1

简单但准确的答案。谢谢! – 2011-11-09 17:49:30

+0

嗨gabor,我只是想在我的android应用程序中使用sqlite3库。我将sqlite3.c和sqlite3.h导入到我的项目中的jni文件夹中。接下来我应该做什么? – idish 2012-12-09 08:13:27

+1

哇140+线,C是最好的 – user457015 2013-08-02 21:18:24

3

请参阅SQLite Android绑定http://www.sqlite.org/android/doc/trunk/www/index.wiki,其中描述了如何为Android目标15(4.0.3)和更高版本包含sqlite3。它在下面复制。

的SQLite的Android绑定

SQLite库是Android环境的核心部分。 Java 应用程序和内容提供者使用android.database.sqlite命名空间中的接口 访问SQLite。使用Android的内置的SQLite支持

一个缺点是, 应用程序被强制使用的SQLite版本的Android 当前版本发生一起出货。如果您的应用程序 恰巧需要更新版本的SQLite,或者安装了自定义 扩展或VFS的版本,那么您运气不好。

此项目中的代码允许使用Android NDK 打造的SQLite的一个定制版本的应用程序与应用程序 运,同时仍继续使用标准的Java接口。

正常使用

安装

的Android API等级15(安卓4.0.3),和更大的支持。如果目标API级别为16或更高的 ,请使用此项目的默认“中继”分支 。或者,对于API级别15,请使用“api-level-15”分支。它不可能以 为目标的API级别低于15。

从这个项目将下列文件复制到应用程序项目中的等价 位置。

jni/Android.mk 
jni/Application.mk 
jni/sqlite/*    (copy contents of directory recursively) 
src/org/sqlite/database/* (copy contents of directory recursively) 

在此之后,目录结构应包含 这些文件。

对于API级别15只,也复制以下:

src/org/sqlite/os/*   (copy contents of directory recursively) 

目录 “JNI /源码/” 包含sqlite3.h 和sqlite3.c源文件的副本。在它们之间,它们包含SQLite库的源代码 。如有必要,请将其替换为源 以获取所需的特定版本的SQLite。如果SQLite是要 与定义任何特殊的预处理器宏编译,将它们添加到 的“JNI /源码/ Android.mk”文件(没有JNI/Android.mk)。

一旦文件被添加到项目,跑项目的根目录下的命令 “NDK建造”。这将编译在JNI /目录(包括自定义的SQLite 版本),以将与该应用程序被部署到该设备沿 共享库 本地代码。假设它是成功的,除非你修改JNI /目录结构中的 来源或makefile文件,你应该 并不需要再次运行“NDK建造”。

应用程序编程

组成的“android.database.sqlite”命名空间中的内置Android SQLite的接口位于 的类。该接口提供 所有相同的类时,除了 “org.sqlite.database.sqlite”命名空间内。这意味着要修改 应用程序使用SQLite的定制版本,所有通常需要 是全部替换“android.database.sqlite” 在源代码中有“org.sqlite.database.sqlite”。

例如,以下内容:

import android.database.sqlite.SQLiteDatabase;

应替换:

import org.sqlite.database.sqlite.SQLiteDatabase;

除了代替在android.database.sqlite的类的所有用途。* 命名空间,应用程序还必须确保使用以下两种:

org.sqlite.database.SQLException
org.sqlite.database.DatabaseErrorHandler

代替:

android.database.SQLException
android.database.DatabaseErrorHandler

除了命名空间的变化, 有是从股票Android界面其他差异应用程序需要注意:

SQLiteStatement.simpleQueryForBlobFileDescriptor()API不是 可用。 排序顺序“UNICODE”不可用。 排序顺序“LOCALIZED”通常与 系统的当前语言环境一致,总是等同于SQLite内置的 排序规则BINARY。