在Android平台上应用Berkeley DB 11gR2 SQL(side-by-side模式)
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模式的编译方式。

hi,你得开心网账户是什么阿?我想下载”从开心网共享文件夹下载ndk- wrappers.tgz“。 谢谢!
@xue
你好,我们的群组地址是: http://www.kaixin001.com/group/group.php?gid=627784。欢迎交流!
你好,我在一个嵌入式平台上(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>