かなりマニアックな話。


バイナリ提供されているSQLite JDBCでは、ここに書かれているように
Linux : amd64,i386
Mac : i386,x86_64
Windows : amd64,x86
がサポートされており、nativeモードとしてそれぞれのライブラリが環境に合わせて使用される。
それ以外のOS、CPUの場合は、pure-javaモードというで動作する。これはとてもよくできた仕組みのようだが、今回苦しんだのが、このpure-javaモードだった。
というのも、とあるシステムで、Windows上でSQLiteを使用して開発していた時と、arm上のLinuxで動作させた時のSQLiteの性能が、単純にハードのスペック以上に差があり、armをあきらめようかと思っていたほどだった。(差は50~100倍もあり、定期的にデータを収集する今回のシステムで、データベースアクセスだけで分単位の時間を要するのは致命的)

根気よく調べていくと、上記のようなモードの違いによる差があることが分かり、それならばLinuxでのarmもnativeモードとして動作させようと、SQLite JDBCをビルドから行ってみることにした。


今回のターゲットは、「OpenBlocks A6」
# uname -a
OpenBlocks A6(Linux obsa6 2.6.31 #1 Thu Sep 13 11:31:10 JST 2012 armv5tel GNU/Linux)

おおむねそのままではあるが、こちらにならってビルドを試みる。

まずは、パッケージを最新化
# apt-get update

続いて、Mercurial(hg)とやらをインストール。
# apt-get install mercurial

Maven3をインストール。Maven3はapt-getできないので手動登録。以下を参考に。
http://lukieb.wordpress.com/2011/02/15/installing-maven-3-on-ubuntu-10-04-lts-server/
# wget http://ftp.riken.jp/net/apache/maven/maven-3/3.0.4/binaries/apache-maven-3.0.4-bin.zip
# unzip apache-maven-3.0.4-bin.zip
# mkdir /usr/local/apache-maven/
# cp -R apache-maven-3.0.4 /usr/local/apache-maven/
# export M2_HOME=/usr/local/apache-maven/apache-maven-3.0.4
# export MAVEN_HOME=/usr/local/apache-maven/apache-maven-3.0.4
# export M2=/usr/local/apache-maven/apache-maven-3.0.4/bin
# export PATH=$PATH:/usr/local/apache-maven/apache-maven-3.0.4/bin
# mvn -version
Apache Maven 3.0.4 (r1232337; 2012-01-17 17:44:56+0900)
Maven home: /usr/local/apache-maven/apache-maven-3.0.4
Java version: 1.7.0_04-ea, vendor: Oracle Corporation
Java home: /usr/lib/jre
Default locale: ja_JP, platform encoding: UTF-8
OS name: "linux", version: "2.6.31", arch: "arm", family: "unix"

次にJava。今回使ったのはOpenBlocksA6のJava7Embedded付属版だったが、JDKはついていないので、openjdkを入れる。
# apt-get install openjdk
# java -version
java version "1.6.0_18"
OpenJDK Runtime Environment (IcedTea6 1.8.13) (6b18-1.8.13-0+squeeze2)
OpenJDK Zero VM (build 14.0-b16, mixed mode)
# javac -version
javac 1.6.0_18
# export JAVA_HOME=/usr
(jre7が入っているので、JAVA_HOMEが設定されているが、いったんビルドのために置き換えた)

次に、sqlite-jdbcを取得。
WiKiページにあるように最新ソース(現時点では3.7.8-SNAPSHOT)を取得してビルドすると、どうしてもmavenのtestでエラーとなりjarが作れなかったため、安定版のソースで実施する。
# wget https://bitbucket.org/xerial/sqlite-jdbc/get/sqlite-jdbc-3.7.2.zip
# unzip sqlite-jdbc-3.7.2.zip
# cd xerial-sqlite-jdbc-f62882bb858d/
# cp -p Makefile.common{,.org}
# vi Makefile.common
# diff Makefile.common{,.org}
52c52
< Default_CFLAGS    := -I$(JAVA_HOME)/include -Isqlitejdbc/lib/inc_mac -I/usr/lib/jvm/java-6-openjdk/include -Os -fPIC
---
> Default_CFLAGS    := -I$(JAVA_HOME)/include -Isqlitejdbc/lib/inc_mac -Os -fPIC

# cp -p pom.xml{,.org}
# vi pom.xml
# diff pom.xml{,.org}
6c6
<   <version>3.7.2-armv5tel</version>
---
>   <version>3.7.2</version>
112c112
< </project>
---
> </project>
\ ファイル末尾に改行がありません
#
Makefile.commonでopenjdkのincludeを教えてあげるのと、pom.xmlでバージョン番号は適当に付与。

いざビルド
# make
・・・
[INFO] Building jar: /root/xerial-sqlite-jdbc-f62882bb858d/target/sqlite-jdbc-3.7.2-armv5tel.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4:26.030s
[INFO] Finished at: Wed Oct 17 22:38:24 JST 2012
[INFO] Final Memory: 10M/27M
[INFO] ------------------------------------------------------------------------
# ls target/sqlite-jdbc-3.7.2-armv5tel.jar -lh
-rw-r--r-- 1 root root 3.4M 2012-10-17 22:38 target/sqlite-jdbc-3.7.2-armv5tel.jar
成功。

SQLiteがnativeモードで動くか確認してみる。
# cd ~/
# mkdir tmp
# cd !$
# cp -p /root/xerial-sqlite-jdbc-f62882bb858d/target/sqlite-jdbc-3.7.2-armv5tel.jar .
# vi Sample.java
# cat Sample.java
import org.sqlite.SQLiteJDBCLoader;

public class Sample{
  public static void main(String args[]){
        System.out.println(
                String.format(
                "running in %s mode", SQLiteJDBCLoader.isNativeMode() ? "native" : "pure-java"));
  }
}
# javac Sample.java -cp sqlite-jdbc-3.7.2-armv5tel.jar
# java -cp .:sqlite-jdbc-3.7.2-armv5tel.jar Sample
running in native mode
Good!!
ちなみに、通常配布されているsqlite-jdbc-3.7.2.jarで動かすと、
# java -cp .:sqlite-jdbc-3.7.2.jar Sample
running in pure-java mode
と、armはnative登録されていないので、pure-javaモードで動く。



これで作成したsqlite-jdbcを使ってアプリを動かしたら、驚くほどのスピードでDBアクセスが行われた。
めでたしめでたし!!!