首页 > Berkeley DB, 赵汝聪 > 在Android平台上应用Berkeley DB 11gR2 SQL(side-by-side模式)

在Android平台上应用Berkeley DB 11gR2 SQL(side-by-side模式)

2010年4月1日 赵汝聪

Berkeley DB(BDB)从新发布的版本11gR2开始支持SQL。BDB在性能上的优势详见博文”Oracle Berkeley DB 支持SQL啦”以及更多关于Oracle Berkeley DB SQL的报道。本文将介绍如何在Android上开发平台上编译并运行BDB 11gR2 SQL库(以下简称DBSQL)。

本文介绍在Linux平台上如何编译得到适用于Android的DBSQL库,依本文方法编译得到的BDB库将和Android自带的SQLite库并存,我们称其为side-by-side(并存)模式。在这种模式下,Android平台上已有的应用程序还是基于原始的SQLite库,而我们自己编译的应用程序则链接到DBSQL库以获取更高的存储和并发性能。

1. 安装开发环境

(本文假定读者已具备初步的Android Emulator使用经验)
安装SDK
http://developer.android.com/sdk/index.html下载Android SDK并解压缩得到$HOME/android/android-sdk-linux_86/目录。

安装NDK
http://developer.android.com/intl/zh-TW/sdk/ndk/index.html下载Linux版Android NDK(android-ndk-r3-linux-x86.zip)并解压缩得到$HOME/android/android-ndk-1.6_r3/目录。

$ cd android-ndk-1.6_r3
$ build/host-setup.sh

安装NDK Wapper
从开心网共享文件夹下载ndk-wrappers.tgz到$HOME/android

$ tar zxvf ndk-wrappers.tgz

ndk-wrapper需要以下变量,因此我们需要把以下变量增加到$HOME/.bashrc并使之生效:

export PATH=$HOME/android/ndk-wrappers/bin:$PATH
$ export NDK_DIR=$HOME/android/android-ndk-1.6_r3
$ export PATH=$HOME/android/android-sdk-linux_86/tools:$PATH
$ . $HOME/.bashrc

(NDK-Wrapper默认使用arm-eabi-gcc 4.2.1, 如果你想使用ndk里面的arm-eabi-gcc 4.4.0,把scripts/env-utils.sh 和setup.sh里面的4.2.1改为4.4.0)

开始安装ndk-wrapper:

$ cd ndk-wrappers
$ ./setup.sh

修改Ndk-Wrapper
修改ndk-wrappers/bin/arm-linux-gcc:

1. 在LINK_FLAGS中增加"-ldl"
2. 删除-fvisibility=hidden

试验Ndk-Wrapper是否可工作

$ arm-linux-gcc --version
arm-eabi-gcc (GCC) 4.4.0
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

2. 编译DBSQL

以下我们使用上面搭建的NDK编译环境来编译适用于Android平台上的DBSQL库。首先从Oracle官网上下载Berkeley DB 11gR2(.tar.gz), 解压并改名为db/

设置CFLAGS

$ export CFLAGS="-DHAVE_USLEEP=1 -DSQLITE_DEFAULT_JOURNAL_SIZE_LIMIT=1048576 \
-DNDEBUG=1 -DSQLITE_TEMP_STORE=3 -DSQLITE_OS_UNIX=1 -D_HAVE_SQLITE_CONFIG_H \
-DSQLITE_THREAD_OVERRIDE_LOCK=-1 -Dfdatasync=fsync -DNO_ANDROID_FUNCS \
-DSQLITE_THREADSAFE=1"

设置为动态编译方式

$ cd db/build_unix
$ ../dist/configure --prefix=$HOME/android/install_db_arm --target=arm-linux \
--host=arm-linux --enable-smallbuild --enable-sql --enable-sql_compat \
--enable-statistics --enable-amalgamation

修改build_unix/db_config.h
每次configure完成后,切记都要编辑build_unix/db_config.h,删除以下两行:

#define HAVE_PREAD 1
#define HAVE_PWRITE 1

开始编译

$ make dbsql

生成的动态库文件为.libs/libdb_sql-5.0.so,Shell文件为.libs/dbsql。

3. 使用DBSQL库

我们使用现成的DBSQL范例来演示如何在自己的程序中使用DBSQL库

编译范例

$ cd  build_unix
$ make ex_sql_query

编译完成后生成范例程序.libs/ex_sql_query /data/bdb

运行范例
启动Android Emulator,上传,并运行DBSQL库和范例

$ adb shell mkdir /data/bdb
$ adb shell mkdir /data/sql/examples/data
$ adb shell mkdir /data/sql
$ adb shell mkdir /data/sql/examples
$ adb shell mkdir /data/sql/examples/data
$ adb push .libs/libdb_sql-5.0.so /data/bdb
$ adb push .libs/ex_sql_query /data/bdb
$ adb push ../sql/examples/data/ /data/sql/examples/data
$ adb shell "cd /data/bdb; export LD_LIBRARY_PATH=/data/bdb; ./ex_sql_query"

现在终端应该已经输出query范例的运行结果了。以下是GUI终端的输出截图:

4. 结束语

至此,关于BDB 11gR2 SQL库的side-by-side编译模式的介绍就结束了。我们可将编译得到的库应用到自己的程序中去。side-by-side模式的优点不改动Android系统底层库和镜像,使用简单。缺点是只能用C/JNI方式调用,无法用Android自带的SQL接口直接调用。而与此对应的是Drop-in模式,Drop-in模式可将Android系统的SQLite层整个替换为BDB 11gR2 SQL,应用程序无修改就可以直接使用,是一种更为强大彻底的应用模式。我们将在后续文章中介绍Drop-in模式的编译方式。

分类: Berkeley DB, 赵汝聪 标签: , ,
  1. xue
    2010年4月20日22:09 | #1

    hi,你得开心网账户是什么阿?我想下载”从开心网共享文件夹下载ndk- wrappers.tgz“。 谢谢!

  2. 赵汝聪
    2010年4月21日09:29 | #2
  3. kcmb007
    2010年6月17日15:01 | #3

    你好,我在一个嵌入式平台上(arm平台)编译了bdb 5.0.21, 运行后有点问题。但是我用sqlite的源码编译出来的使用似乎没有什么问题。是我编译的有问题吗?请指教一下

    root@Moxa:/dev/shm# ./sqlite3 a
    Berkeley DB 11g Release 2, library version 11.2.5.0.21: (March 30, 2010)
    Enter “.help” for instructions
    Enter SQL statements terminated with a “;”
    dbsql> create table a ( t int);
    /dev/shm/a: unable to initialize mutex: Function not implemented
    /dev/shm/a: PANIC: Function not implemented
    /dev/shm/a: unable to join the environment
    Error: database disk image is malformed
    dbsql> .quit
    root@Moxa:/dev/shm# ./dbsql a
    Berkeley DB 11g Release 2, library version 11.2.5.0.21: (March 30, 2010)
    Enter “.help” for instructions
    Enter SQL statements terminated with a “;”
    dbsql> create table a( t int);
    /dev/shm/a: library build did not include support for locking
    /dev/shm/a: library build did not include support for locking
    /dev/shm/a: library build did not include support for locking
    /dev/shm/a: library build did not include support for locking
    /dev/shm/a: library build did not include support for locking
    /dev/shm/a: PANIC: Operation not supported
    /dev/shm/a: unable to join the environment
    Error: database disk image is malformed
    dbsql>

本文的评论功能被关闭了.
Դ