hamsterdb を Androidアプリで動かしてみる(2)
どうもです、DUMAPICです。
今回もタイトルのとおりなんですけれども、実践的に使ったらどうなるんだろうか、ということでちょっとアプリを作ってみました。(Android標準ブラウザのブックマークを読み取ってタグ管理するようなアプリ)
アプリは野良アプリですので、インストール時には端末側の設定をお忘れなく。

* * * * * * *
【ソースファイル】
githubにリポジトリ作りました
【APKファイル】
アプリダウンロード先(githubのdownloads)
※アプリは自己責任での利用をお願いします。またソースコードは利用ライブラリの制約によりGPL2に準じていますのでご注意を。
* * * * * * *
結局、KVSのことをよく知らない(今もですけど)ので、テーブル設計(KVS的にはなんて言うんだろう)というかキー構造というかデータ構造の仕様決めに手間取りました。アプリの基本的な部分にも詰まりましたけれどもw
なんていうか、最初はカーソル使うぜー、ソート使うぜーという勢いで取り掛かってみたものの、非常にめんどくさいプログラムを強いられそうな予感がしたので、結局カーソルとかは使わず比較的素直なつくりになっています。たぶん。
えっと、ほかにもあるんですけど、詳しくはソース見てね、で今回も逃げます。
それと、意外にこのサンプルアプリ開発に時間をとられてしまったので、一旦 hamsterdb からは遠ざかります。
本当はこのアプリをマーケットにアップしたかったのですが、高解像度アイコンであえなく撃沈。絵心ないッス。
あとWebサービス連携とかね。これは次の機会かな。
脈絡ないのはいつもですが、この辺で。
ではでは。
今回もタイトルのとおりなんですけれども、実践的に使ったらどうなるんだろうか、ということでちょっとアプリを作ってみました。(Android標準ブラウザのブックマークを読み取ってタグ管理するようなアプリ)
アプリは野良アプリですので、インストール時には端末側の設定をお忘れなく。

【ソースファイル】
githubにリポジトリ作りました
【APKファイル】
アプリダウンロード先(githubのdownloads)
※アプリは自己責任での利用をお願いします。またソースコードは利用ライブラリの制約によりGPL2に準じていますのでご注意を。
結局、KVSのことをよく知らない(今もですけど)ので、テーブル設計(KVS的にはなんて言うんだろう)というかキー構造というかデータ構造の仕様決めに手間取りました。アプリの基本的な部分にも詰まりましたけれどもw
なんていうか、最初はカーソル使うぜー、ソート使うぜーという勢いで取り掛かってみたものの、非常にめんどくさいプログラムを強いられそうな予感がしたので、結局カーソルとかは使わず比較的素直なつくりになっています。たぶん。
えっと、ほかにもあるんですけど、詳しくはソース見てね、で今回も逃げます。
それと、意外にこのサンプルアプリ開発に時間をとられてしまったので、一旦 hamsterdb からは遠ざかります。
本当はこのアプリをマーケットにアップしたかったのですが、高解像度アイコンであえなく撃沈。絵心ないッス。
あとWebサービス連携とかね。これは次の機会かな。
脈絡ないのはいつもですが、この辺で。
ではでは。
hamsterdb を Androidアプリで動かしてみる(1)
どうもです、DUMAPICです。
前回の記事で、組み込み向けのkey-valueストア hamsterdb を動かしみたわけですが、どうも実践向きではないんですよね。
で、まあ、サンプルアプリでも作らないとイメージつかめないよね、ということでまずはパフォーマンスを図るためのツールアプリから、ということで作ってみました。
ソースコードはこちら -> Ham4Droid.jpeg
※必ず上記リンクからファイルダウンロードしてください(開かないでください)。
ダウンロード後、拡張子jpegをzipにしてZip圧縮ファイルに変換後、解凍ツールで中身を取り出してください。
動かした様子は、この画像のとおり。

まだまだ、こんなものです。
Android独自のParcelと、JavaのSerializableを使ったObjectを使用しての処理時間計測です。
詳しいことはめんどくさいのでソースを見てください。
なお、上記リンクで配布したソースはhamsterdbのライセンス規約に従いGPL2となりますのでご了承ください。
ちなみに今後の課題など。
・可変キーに対応していない。
・トランザクションやカーソルを試していない。
・そもそもSQLiteとパフォーマンス比較してない。
・思ったより遅くね?
ではでは。
前回の記事で、組み込み向けのkey-valueストア hamsterdb を動かしみたわけですが、どうも実践向きではないんですよね。
で、まあ、サンプルアプリでも作らないとイメージつかめないよね、ということでまずはパフォーマンスを図るためのツールアプリから、ということで作ってみました。
ソースコードはこちら -> Ham4Droid.jpeg
※必ず上記リンクからファイルダウンロードしてください(開かないでください)。
ダウンロード後、拡張子jpegをzipにしてZip圧縮ファイルに変換後、解凍ツールで中身を取り出してください。
動かした様子は、この画像のとおり。

まだまだ、こんなものです。
Android独自のParcelと、JavaのSerializableを使ったObjectを使用しての処理時間計測です。
詳しいことはめんどくさいのでソースを見てください。
なお、上記リンクで配布したソースはhamsterdbのライセンス規約に従いGPL2となりますのでご了承ください。
ちなみに今後の課題など。
・可変キーに対応していない。
・トランザクションやカーソルを試していない。
・そもそもSQLiteとパフォーマンス比較してない。
・思ったより遅くね?
ではでは。
組み込み向け軽量key-valueストア「hamsterdb」をAndroidで動かしてみた
どうもです、DUMAPICです。
いつものことですが、ブログは久々になります(汗。
一応初めて来た方のためにお伝えしておくと、私はAndroid端末向けアプリをいくつか開発・公開しているアプリ開発者です。
さて今回は、開発者向けの話題で「hamsterdbをAndroidで動かすまで」という内容です。
つい先日、Twitterでフォローさせていただいた方が、hamsterdb本家のソースコードをAndroidで動かせる共有ライブラリにビルドする形をまとめてくださったので、その成果を使わせていただきました。
この場を借りて「glacefullife-Hamster-DB-for-Android - GitHub」環境を作った@myb1126氏、ならびに今回のお話のそもそもの発端を作った@vvakame氏に御礼申し上げます。
ありがとうございました。
さて、このページを見つけた方はhamsterdbで検索してきた方と思いますので、技術的な前説はなしでいきます。
でもちょっぴり不親切感があるので、ちょっとだけですが前説を。
<お約束>
この記事に書いてあることは無保証です。この手順を行ったことであなたが被ったあらゆる被害・損害に対して、わたくしをはじめ@myb1126氏・@vvakame氏、およびhamsterdb関係者は一切責を負わないものとします。
(協力を得ながら私が勝手にやっていることです。それ以上でもそれ以下でもありません。)
◆本家サイト
hamsterdb - Embedded Database
http://hamsterdb.com/
◆hamsterdbとは
NoSQLの分類にカテゴライズされることもあるkey-value型のデータストア製品。組み込み向けをウリにしています。そして組み込み向けということは、そう、Androidをはじめとするモバイルプラットフォームで使用できるはず、という着眼ですね。
で、そんなhamsterdbですが、以下のライセンスで提供されています。無償・有償どちらにするかは悩みどころですね。
◆今回の作業を行った私のPC環境
・Windows7 Pro(64bit)。CPUはIntelハイッテル。
・Eclipse 3.6.2 (ADT 10.0.0導入済)
では、早速いきましょうか。「hamsterdbをAndroidで動かすまでの手順メモ」ベータ版。
まず、手順の大まかな流れです。ちなみにAndorid開発者向けの各種開発環境は導入済みであることを前提とします。また、私はmacを持っていないので機種やOS依存のところは適宜読み替えてください。
1.Windows環境でhamsterdbのソースコードをビルドする環境を構築する
(1)GoogleのAndroid DevelopersからNDKをダウンロードする
(2)本家HPからJava-wrapperライブラリとサンプルコードをダウンロードする
(3)Cygwinをインストールする。
2.Android用共有ライブラリとして本家ソースコードをビルドする
(1)Cygwin内にNDKを解凍・展開する
(2)@myb1126氏の「glacefullife-Hamster-DB-for-Android - GitHub」のリポジトリcloneを作成する
(3)ビルド(ndk-build)!
3.サンプルアプリ内で動かしてみる
(1)新規にAndroidプロジェクトを作成して、本家のJavaライブラリととサンプルコードを取り込む
(2)Androidプロジェクト内にビルドでできたsoファイルを配置する
(3)System.loadLibraryを実装。Db1.javaをちょこっと修正。
(4)さぁ動かそう
* * * * * * * * *
(1)GoogleのAndroid DevelopersからNDKをダウンロードする
Android DevelopersページのサイトからAndroid NDKをダウンロードしてください。
私がダウンロードしたのは2011/4/7現在でAndroid NDK, Revision 5b(android-ndk-r5b-windows.zip)でした。
(2)本家HPからJava用ラッパーライブラリ(hamsterdb Embedded Storage Java API)とサンプルコードをダウンロードする
Java用ラッパーライブラリ(nativeメソッドを実装してjavaから扱いやすくしたもの)は、 こちらのページのhamsterdb Embedded Storage Java APIからダウンロード(Sourcesリンク)します。
私がダウンロードしたバージョンは「02/18/11 - hamsterdb-java 0.0.3」で、Sourcesからダウンロードしたファイル名は「hamsterdb-java-0.0.3.tar.gz」でした。
サンプルコードは上記ラッパーライブラリを使用した簡単な動作確認を行うためのものです。
こちらのページの「Samples for Java」にある「Db1.java」をダウンロードしてください。
(3)Cygwinをインストールする。
Androidデバイスで動作するライブラリをWindows環境でビルドするのに必要です。
ビルドできるのであれば実は何でもいいです。扱いが簡単なので私はCygwinを選びました。
まずCygwinを入手します。
Cygwin本家HPにアクセスして、 Cygwinのsetup.exeをダウンロードします(ダウンロードするファイルはsetup.exe単品のみとなります)。 Cygwin本家トップページの「Current Cygwin DLL version」というセクションにsetup.exeというリンクがあるのでそこからダウンロードするとよいでしょう。
私がダウンロードしたバージョンは「1.7.9-1」です。
次に、早速「管理者権限で」今落としてきたsetup.exeを実行しましょう。
以降の細かい手順はこちら「Tech Booster - Android NDKを使う(アプリの高速化)」の記事が詳しいので心配な方は参照してみてください。
なお、インストール時の「Select Packages」では、Develカテゴリー内の下記モジュールを指定してください。
(git関連はわかんなかったので適当ですが問題はなかったです、ハイ)
続けて次の手順に進みます。
* * * * * * * * *
さあ、ここからが本番です。
ちなみに、便宜上、ここでは以下のような表記をすることにします。
(1)Cygwin内にNDKを解凍・展開する。
「%CYGWIN_ROOT%/home」ディレクトリ内に、%USERNAME%と同名のディレクトリがあるはずです。
例えば、インストールした時の(=現在の)Windowsアカウントが「hogesage」であれば、%CYGWIN_ROOT%/home/hogesageのように。
その「%CYGWIN_ROOT%/home/%USERNAME%」ディレクトリ内に、先ほどダウンロードしたNDKのZIPを解凍・展開します。
完了後、「%CYGWIN_ROOT%/home/%USERNAME%/%ANDROID_NDK_DIR%」に、「ndk-build」というファイルと「sources」というディレクトリがあることを確認してください。
(2)@myb1126氏の「glacefullife-Hamster-DB-for-Android - GitHub」リポジトリのcloneを作成する
Cygwinを起動します。
以下のコマンドを実行して、カレントディレクトリを%CYGWIN_ROOT%/home/%USERNAME%/%ANDROID_NDK_DIR%/sourcesに移します。
次にCygwin上で以下のコマンドを実行します。
cloneが終わると、以下のようなメッセージが出てコマンド入力に復帰します。
おめでとうございます。ソースコードの取得は終わりました。
%CYGWIN_ROOT%/home/%USERNAME%/%ANDROID_NDK_DIR%/sources/Hamster-DB-for-Androidのディレクトリがあることを確認してください。
(3)ビルド(ndk-build)!
続けて、以下のコマンドを実行してカレントディレクトリを「%CYGWIN_ROOT%/home/%USERNAME%/%ANDROID_NDK_DIR%/sources/Hamster-DB-for-Android」に移動します。
で、以下のコマンドを実行してビルドを開始します!
つまり、カレントディレクトリを%CYGWIN_ROOT%/home/%USERNAME%/%ANDROID_NDK_DIR%/sources/Hamster-DB-for-Androidに維持したまま、 %CYGWIN_ROOT%/home/%USERNAME%/%ANDROID_NDK_DIR%/ndk-buildを実行します。
ビルドが完了すると、以下のメッセージが表示されるとともに、Cygwinがコマンド入力待ち状態になります。
Androidに取り込むためのsoファイルができたかどうか早速確認しましょう。
上記メッセージにも表示されているように、Androidに取り込むsoファイルは以下の場所に生成されています。
ありましたか?さあ、次はAndroidで動かします!
(1)新規にAndroidプロジェクトを作成して、本家のJavaライブラリととサンプルコードを取り込む
Eclipseを起動し、新規にAndroidプロジェクトを作りましょう。
なお、便宜上、新規作成したAndoridプロジェクトのルートフォルダのフルパスを"%ANDROID_PROJECT_ROOT%"と表記します。
たとえば、あなたのEclipseのワークスペースがC:\android\eclipse\workspaceであり、 新規プロジェクト名を「HelloHamsterDB」とした場合の%ANDROID_PROJECT_ROOT%は「C:\android\eclipse\workspace\HelloHamsterDB」になります。
ちなみに、新規Androidプロジェクトの際に指定するターゲットAPIレベルはandroid-7(2.1 update1)にしてみました(より低いAPIレベルや高いAPIレベルでの動作は未検証です)。
ついでにAcitivtyとかも適当な名前で作っておきましょう。
で、プロジェクトが作成されたら、%ANDROID_PROJECT_ROOT%直下にlibsフォルダをつくり、さらにlibsフォルダの中にarmeabiフォルダを作成してください。
armeabiフォルダまでのフルパスは「%ANDROID_PROJECT_ROOT%\libs\armeabi」になります。
次に本家Javaライブラリを参照設定しますが、いくつかの方法があります。以下は私が行った手順です。
1) 本家からダウンロードしてきた「hamsterdb-java-0.0.3.tar.gz」を解凍し、その中の java フォルダにあるhamsterdb-0.0.3.jarを取り出します。
2) hamsterdb-0.0.3.jarを「%ANDROID_PROJECT_ROOT%\libs」フォルダ内に配置します。(エクスプローラーでコピペ/移動)
3) プロジェクトのプロパティから「javaのビルドパス」の項目を表示し、「ライブラリ」タブの「Jar追加」で、1)のhamsterdb-0.0.3.jarを参照設定します。
さらに、本家から同様に落としてきたサンプルコード(Db1.java)を、プロジェクト新規作成時についでに作ったActivityと同じパッケージ内にコピペします。
(もちろんパッケージを別に作ってそこにおいてもよいです)。
でも、この時点ではまだDb1.javaはエラーになっています。これはDb1.javaにpackage名が指定されていないからです。
Db1.javaの先頭行に package "Androidプロジェクトのpackage名"; を挿入して再保存して下さい。
たとえば、このAndroidプロジェクトのパッケージ名に"jp.hoge.foo.hamsterdbtest"を指定していたら「package jp.hoge.foo.hamsterdbtest;」のように。
するとエラーがなくなるはずです。次に進みましょう。
(2)Androidプロジェクト内にビルドでできたsoファイルを配置する
先ほどのビルドで「%CYGWIN_ROOT%/home/%USERNAME%/%ANDROID_NDK_ROOT%/sources/Hamster-DB-for-Android/libs/armeabi」に生成された 「libhamsterdb-java.so」を「%ANDROID_PROJECT_ROOT%\libs\armeabi」にコピペします。
もう動かせそう?いやいや、まだもう少し!
(3)System.loadLibraryを実装。Db1.javaをちょこっと修正。
とりあえず作ったhello androidを表示するだけのActivityのソースをEclipseで開きstatic初期化子のブロックを挿入します。
さらにそのブロック内にSystem.loadLibrary("hamsterdb-java");を挿入します。
これで、Activityがクラスロードされる都度、soファイルを動的に参照するようになります。
ActivityのonCreate内(onStartでもどこでも)に、Db1.javaのrunメソッドを記述します。
throws節が定義されているのでtry-catchで囲んで適当に実装します。
エントリーポイントとなるメソッド(public static void main(String args[]))が定義されていますが、実行時エラーになるため、このメソッドを削除します。
そして、hamsterdbの実体ファイルを示す"test.db"と記述している箇所をAndroidの環境に合うように修正します。
※test.dbのままだとI/Oエラーで落ちます。パーミッションがないところに作ろうとするんでしょうね。
とりあえず、sdcardにデータベースファイルを作成するようにしてみましょう。要は絶対パスでファイル生成場所を指定するイメージです。
2箇所 db.create("test.db") と書いてあるので、全部書き換えましょう。
(4)さぁ動かそう
お疲れさまでした。やっと動かせますよ。
クラッシュした時の実機へのダメージが想定できない(まだよくわかってない)ので、エミュレータで動かすことにします。
自分の場合はAPILevel-8(Android 2.2)のエミュレータを使用しました。エミュレータを用意していない場合は動かす前に作っておきましょう。
で、デバッグモードで起動して........ささやき - いのり - えいしょう - ねんじろ!
"Success!"がlogcatに出力されましたか?
出たら(たぶん)正常稼働しました。おめでとうございます。
* * * * * * * * *
おつきあいありがとうございました。
手順メモは以上になります。質問されても答えられないので、申し訳ないですが自力で判断・解決してください。
それでは、楽しい公、いやハム、いやいやhamsterdbライフを!
いつものことですが、ブログは久々になります(汗。
一応初めて来た方のためにお伝えしておくと、私はAndroid端末向けアプリをいくつか開発・公開しているアプリ開発者です。
さて今回は、開発者向けの話題で「hamsterdbをAndroidで動かすまで」という内容です。
つい先日、Twitterでフォローさせていただいた方が、hamsterdb本家のソースコードをAndroidで動かせる共有ライブラリにビルドする形をまとめてくださったので、その成果を使わせていただきました。
この場を借りて「glacefullife-Hamster-DB-for-Android - GitHub」環境を作った@myb1126氏、ならびに今回のお話のそもそもの発端を作った@vvakame氏に御礼申し上げます。
ありがとうございました。
さて、このページを見つけた方はhamsterdbで検索してきた方と思いますので、技術的な前説はなしでいきます。
でもちょっぴり不親切感があるので、ちょっとだけですが前説を。
<お約束>
この記事に書いてあることは無保証です。この手順を行ったことであなたが被ったあらゆる被害・損害に対して、わたくしをはじめ@myb1126氏・@vvakame氏、およびhamsterdb関係者は一切責を負わないものとします。
(協力を得ながら私が勝手にやっていることです。それ以上でもそれ以下でもありません。)
◆本家サイト
hamsterdb - Embedded Database
http://hamsterdb.com/
◆hamsterdbとは
NoSQLの分類にカテゴライズされることもあるkey-value型のデータストア製品。組み込み向けをウリにしています。そして組み込み向けということは、そう、Androidをはじめとするモバイルプラットフォームで使用できるはず、という着眼ですね。
で、そんなhamsterdbですが、以下のライセンスで提供されています。無償・有償どちらにするかは悩みどころですね。
- Open Source Licenses(無償版)・・・GPL2ライセンス(... GNU Public License 2 or any later version (or other FOSS licenses). 本家より)。このライセンスでアプリを作るとGPL汚染と呼ばれるソースコードオープン化の連鎖に飲み込まれます。たぶん。詳しいライセンスは本家のこことかここ。
- The Commercial License(有償版)・・・開発者の人数に応じたライセンスになっているようです(2011/04/07時点)。本家HPのここやここを参照してください。2011/04/07現在、開発者5名までのライセンスは450ユーロ(日本円で約5.5万円)でした。
◆今回の作業を行った私のPC環境
・Windows7 Pro(64bit)。CPUはIntelハイッテル。
・Eclipse 3.6.2 (ADT 10.0.0導入済)
では、早速いきましょうか。「hamsterdbをAndroidで動かすまでの手順メモ」ベータ版。
まず、手順の大まかな流れです。ちなみにAndorid開発者向けの各種開発環境は導入済みであることを前提とします。また、私はmacを持っていないので機種やOS依存のところは適宜読み替えてください。
1.Windows環境でhamsterdbのソースコードをビルドする環境を構築する
(1)GoogleのAndroid DevelopersからNDKをダウンロードする
(2)本家HPからJava-wrapperライブラリとサンプルコードをダウンロードする
(3)Cygwinをインストールする。
2.Android用共有ライブラリとして本家ソースコードをビルドする
(1)Cygwin内にNDKを解凍・展開する
(2)@myb1126氏の「glacefullife-Hamster-DB-for-Android - GitHub」のリポジトリcloneを作成する
(3)ビルド(ndk-build)!
3.サンプルアプリ内で動かしてみる
(1)新規にAndroidプロジェクトを作成して、本家のJavaライブラリととサンプルコードを取り込む
(2)Androidプロジェクト内にビルドでできたsoファイルを配置する
(3)System.loadLibraryを実装。Db1.javaをちょこっと修正。
(4)さぁ動かそう
1.Windows環境でhamsterdbのソースコードをビルドする環境を構築する
(1)GoogleのAndroid DevelopersからNDKをダウンロードする
Android DevelopersページのサイトからAndroid NDKをダウンロードしてください。
私がダウンロードしたのは2011/4/7現在でAndroid NDK, Revision 5b(android-ndk-r5b-windows.zip)でした。
(2)本家HPからJava用ラッパーライブラリ(hamsterdb Embedded Storage Java API)とサンプルコードをダウンロードする
Java用ラッパーライブラリ(nativeメソッドを実装してjavaから扱いやすくしたもの)は、 こちらのページのhamsterdb Embedded Storage Java APIからダウンロード(Sourcesリンク)します。
私がダウンロードしたバージョンは「02/18/11 - hamsterdb-java 0.0.3」で、Sourcesからダウンロードしたファイル名は「hamsterdb-java-0.0.3.tar.gz」でした。
サンプルコードは上記ラッパーライブラリを使用した簡単な動作確認を行うためのものです。
こちらのページの「Samples for Java」にある「Db1.java」をダウンロードしてください。
(3)Cygwinをインストールする。
Androidデバイスで動作するライブラリをWindows環境でビルドするのに必要です。
ビルドできるのであれば実は何でもいいです。扱いが簡単なので私はCygwinを選びました。
まずCygwinを入手します。
Cygwin本家HPにアクセスして、 Cygwinのsetup.exeをダウンロードします(ダウンロードするファイルはsetup.exe単品のみとなります)。 Cygwin本家トップページの「Current Cygwin DLL version」というセクションにsetup.exeというリンクがあるのでそこからダウンロードするとよいでしょう。
私がダウンロードしたバージョンは「1.7.9-1」です。
次に、早速「管理者権限で」今落としてきたsetup.exeを実行しましょう。
以降の細かい手順はこちら「Tech Booster - Android NDKを使う(アプリの高速化)」の記事が詳しいので心配な方は参照してみてください。
なお、インストール時の「Select Packages」では、Develカテゴリー内の下記モジュールを指定してください。
(git関連はわかんなかったので適当ですが問題はなかったです、ハイ)
[gcc] gcc: C compiler upgrade helper (3.4.4-999) [make] make: The GNU version of the make utility (3.81.2) [git] git: Fast Version Control System - code files (1.7.4-1) git-completion: Fast Version Control System - git bash completion (1.7.4-1) git-svn: Fast Version Control System - git-svn conversions (1.7.4-1) gitk: Fast Version Control System - gitk-viewer (1.7.4-1)以上を指定して次に進むと「指定したモジュールが必要とする他のライブラリも落とすよ」画面になりますが、 細かいことは気にせずインストールを完了させてください。 なお、インストール後の動作確認とか設定は、 先ほどご案内したこちらの記事を参考にしてください(.bashrcとか)。
続けて次の手順に進みます。
2.Android用共有ライブラリとして本家ソースコードをビルドする
さあ、ここからが本番です。
ちなみに、便宜上、ここでは以下のような表記をすることにします。
- Cygwinのセットアップ先(ルートディレクトリ)・・・"%CYGWIN_ROOT%"と表記します。あなたがCygwinのインストール先を"C:\android\cygwin"としていたら、"%CYGWIN_ROOT%"は"C:\android\cygwin"になります。
- あなたが今ログインしているWindowsアカウント名・・・"%USERNAME%"と表記します。
- パス区切り文字・・・"/"で表記します。
- 解凍・展開したNDKのディレクトリ名(フォルダ名)・・・"%ANDROID_NDK_DIR%"と表記。android-ndk-r5b-windows.zipを解凍・展開すると「android-ndk-r5b」になるはず。
(1)Cygwin内にNDKを解凍・展開する。
「%CYGWIN_ROOT%/home」ディレクトリ内に、%USERNAME%と同名のディレクトリがあるはずです。
例えば、インストールした時の(=現在の)Windowsアカウントが「hogesage」であれば、%CYGWIN_ROOT%/home/hogesageのように。
その「%CYGWIN_ROOT%/home/%USERNAME%」ディレクトリ内に、先ほどダウンロードしたNDKのZIPを解凍・展開します。
完了後、「%CYGWIN_ROOT%/home/%USERNAME%/%ANDROID_NDK_DIR%」に、「ndk-build」というファイルと「sources」というディレクトリがあることを確認してください。
(2)@myb1126氏の「glacefullife-Hamster-DB-for-Android - GitHub」リポジトリのcloneを作成する
Cygwinを起動します。
以下のコマンドを実行して、カレントディレクトリを%CYGWIN_ROOT%/home/%USERNAME%/%ANDROID_NDK_DIR%/sourcesに移します。
$ cd ~/%ANDROID_NDK_DIR%/sourcesちなみにカレントディレクトリを確認するには「pwd」コマンドを実行するとよいでしょう。
次にCygwin上で以下のコマンドを実行します。
$ git clone git://github.com/glacefullife/Hamster-DB-for-Androidすると、何かメッセージが出てソースコードのダウンロード(リポジトリのclone)が始まります。
$ git clone git://github.com/glacefullife/Hamster-DB-for-Android Cloning into Hamster-DB-for-Android... remote: Counting objects: 463, done. remote: Compressing objects: 100% (306/306), done. Receiving objects: 54% (251/463), 1.11 MiB | 72 KiB/sもしここでPermission denied (publickey).とかのメッセージが出で終了しているようでしたら、コマンドの一部が誤っている可能性があります。今一度見直してリトライしてください。
cloneが終わると、以下のようなメッセージが出てコマンド入力に復帰します。
Receiving objects: 100% (463/463), 1.59 MiB | 40 KiB/s, done. Resolving deltas: 100% (151/151), done. foosage@yourpc ~/android-ndk-r5b/sources $
おめでとうございます。ソースコードの取得は終わりました。
%CYGWIN_ROOT%/home/%USERNAME%/%ANDROID_NDK_DIR%/sources/Hamster-DB-for-Androidのディレクトリがあることを確認してください。
(3)ビルド(ndk-build)!
続けて、以下のコマンドを実行してカレントディレクトリを「%CYGWIN_ROOT%/home/%USERNAME%/%ANDROID_NDK_DIR%/sources/Hamster-DB-for-Android」に移動します。
$ cd ./Hamster-DB-for-Androidこれからビルドしますが、カレントディレクトリが重要な意味を持っていますので、上記のcdは省略せずにちゃんとやりましょうw
で、以下のコマンドを実行してビルドを開始します!
つまり、カレントディレクトリを%CYGWIN_ROOT%/home/%USERNAME%/%ANDROID_NDK_DIR%/sources/Hamster-DB-for-Androidに維持したまま、 %CYGWIN_ROOT%/home/%USERNAME%/%ANDROID_NDK_DIR%/ndk-buildを実行します。
$ ../../ndk-buildビルドが開始されます。Cygwin画面にいっぱい警告メッセージが出ますが、「printfなどで警告が出るため」ということらしいので気にせず待ちましょう。
ビルドが完了すると、以下のメッセージが表示されるとともに、Cygwinがコマンド入力待ち状態になります。
$ ../../ndk-build Compile thumb : hamsterdb-java <= log.c Compile thumb : hamsterdb-java <= blob.c Compile thumb : hamsterdb-java <= btree.c ~~~中略~~~ SharedLibrary : libhamsterdb-java.so Install : libhamsterdb-java.so => libs/armeabi-v7a/libhamsterdb-java.so foosage@yourpc ~/android-ndk-r5b/sources/Hamster-DB-for-Android $
Androidに取り込むためのsoファイルができたかどうか早速確認しましょう。
上記メッセージにも表示されているように、Androidに取り込むsoファイルは以下の場所に生成されています。
[ディレクトリ] %CYGWIN_ROOT%/home/%USERNAME%/%ANDROID_NDK_DIR%/sources/Hamster-DB-for-Android/libs/armeabi [ファイル名] libhamsterdb-java.so
ありましたか?さあ、次はAndroidで動かします!
3.サンプルアプリ内で動かしてみる
(1)新規にAndroidプロジェクトを作成して、本家のJavaライブラリととサンプルコードを取り込む
Eclipseを起動し、新規にAndroidプロジェクトを作りましょう。
なお、便宜上、新規作成したAndoridプロジェクトのルートフォルダのフルパスを"%ANDROID_PROJECT_ROOT%"と表記します。
たとえば、あなたのEclipseのワークスペースがC:\android\eclipse\workspaceであり、 新規プロジェクト名を「HelloHamsterDB」とした場合の%ANDROID_PROJECT_ROOT%は「C:\android\eclipse\workspace\HelloHamsterDB」になります。
ちなみに、新規Androidプロジェクトの際に指定するターゲットAPIレベルはandroid-7(2.1 update1)にしてみました(より低いAPIレベルや高いAPIレベルでの動作は未検証です)。
ついでにAcitivtyとかも適当な名前で作っておきましょう。
で、プロジェクトが作成されたら、%ANDROID_PROJECT_ROOT%直下にlibsフォルダをつくり、さらにlibsフォルダの中にarmeabiフォルダを作成してください。
armeabiフォルダまでのフルパスは「%ANDROID_PROJECT_ROOT%\libs\armeabi」になります。
次に本家Javaライブラリを参照設定しますが、いくつかの方法があります。以下は私が行った手順です。
1) 本家からダウンロードしてきた「hamsterdb-java-0.0.3.tar.gz」を解凍し、その中の java フォルダにあるhamsterdb-0.0.3.jarを取り出します。
2) hamsterdb-0.0.3.jarを「%ANDROID_PROJECT_ROOT%\libs」フォルダ内に配置します。(エクスプローラーでコピペ/移動)
3) プロジェクトのプロパティから「javaのビルドパス」の項目を表示し、「ライブラリ」タブの「Jar追加」で、1)のhamsterdb-0.0.3.jarを参照設定します。
さらに、本家から同様に落としてきたサンプルコード(Db1.java)を、プロジェクト新規作成時についでに作ったActivityと同じパッケージ内にコピペします。
(もちろんパッケージを別に作ってそこにおいてもよいです)。
でも、この時点ではまだDb1.javaはエラーになっています。これはDb1.javaにpackage名が指定されていないからです。
Db1.javaの先頭行に package "Androidプロジェクトのpackage名"; を挿入して再保存して下さい。
たとえば、このAndroidプロジェクトのパッケージ名に"jp.hoge.foo.hamsterdbtest"を指定していたら「package jp.hoge.foo.hamsterdbtest;」のように。
するとエラーがなくなるはずです。次に進みましょう。
(2)Androidプロジェクト内にビルドでできたsoファイルを配置する
先ほどのビルドで「%CYGWIN_ROOT%/home/%USERNAME%/%ANDROID_NDK_ROOT%/sources/Hamster-DB-for-Android/libs/armeabi」に生成された 「libhamsterdb-java.so」を「%ANDROID_PROJECT_ROOT%\libs\armeabi」にコピペします。
もう動かせそう?いやいや、まだもう少し!
(3)System.loadLibraryを実装。Db1.javaをちょこっと修正。
とりあえず作ったhello androidを表示するだけのActivityのソースをEclipseで開きstatic初期化子のブロックを挿入します。
さらにそのブロック内にSystem.loadLibrary("hamsterdb-java");を挿入します。
これで、Activityがクラスロードされる都度、soファイルを動的に参照するようになります。
public class HelloJni extends Activity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
static
{
System.loadLibrary("hamsterdb-java");
}
}
もう終わり?いや大事なこと忘れていますよ。Db1.javaを動かす実装をしなくちゃ。ActivityのonCreate内(onStartでもどこでも)に、Db1.javaのrunメソッドを記述します。
throws節が定義されているのでtry-catchで囲んで適当に実装します。
public class HelloJni extends Activity
{
private static final String TAG = "hamsterdb-java";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Db1 db = new Db1();
try
{
db.run();
}
catch (DatabaseException e)
{
Log.e(TAG, e.getMessage(), e);
}
}
static
{
System.loadLibrary("hamsterdb-java");
}
}
次にDb1.javaのソースを開いてください。エントリーポイントとなるメソッド(public static void main(String args[]))が定義されていますが、実行時エラーになるため、このメソッドを削除します。
そして、hamsterdbの実体ファイルを示す"test.db"と記述している箇所をAndroidの環境に合うように修正します。
※test.dbのままだとI/Oエラーで落ちます。パーミッションがないところに作ろうとするんでしょうね。
とりあえず、sdcardにデータベースファイルを作成するようにしてみましょう。要は絶対パスでファイル生成場所を指定するイメージです。
2箇所 db.create("test.db") と書いてあるので、全部書き換えましょう。
public class Db1 {
public static final int LOOP=10;
public void run()
throws DatabaseException {
byte[] key=new byte[5];
byte[] record=new byte[5];
Database db=new Database();
/*
* first, create a new database file
*/
//db.create("test.db"); //このままだと落ちる
//
// 次のように変えてみる。sdcardの状態チェックはとりあえず無視しています(ちゃんとやりましょう)。
// なお、AndroidManifest.xmlに以下のパーミッションを定義しておきます。
//
//
// 冗長なので各自適宜修正してください。
//
File dir = Environment.getExternalStorageDirectory();
String dbPath = null;
if(!dir.getPath().endsWith(File.separator))
{
dbPath = dir.getPath() + File.separator;
}
else
{
dbPath = dir.getPath();
}
db.create(dbPath+"test.db");
(4)さぁ動かそう
お疲れさまでした。やっと動かせますよ。
クラッシュした時の実機へのダメージが想定できない(まだよくわかってない)ので、エミュレータで動かすことにします。
自分の場合はAPILevel-8(Android 2.2)のエミュレータを使用しました。エミュレータを用意していない場合は動かす前に作っておきましょう。
で、デバッグモードで起動して........ささやき - いのり - えいしょう - ねんじろ!
04-09 02:22:34.983: DEBUG/dalvikvm(279): Trying to load lib /data/data/com.example.hellojni/lib/libhamsterdb-java.so 0x44eac098 04-09 02:22:35.023: DEBUG/dalvikvm(279): Added shared lib /data/data/com.example.hellojni/lib/libhamsterdb-java.so 0x44eac098 04-09 02:22:35.023: DEBUG/dalvikvm(279): No JNI_OnLoad found in /data/data/com.example.hellojni/lib/libhamsterdb-java.so 0x44eac098, skipping init 04-09 02:22:35.233: DEBUG/dalvikvm(279): Trying to load lib /data/data/com.example.hellojni/lib/libhamsterdb-java.so 0x44eac098 04-09 02:22:35.233: DEBUG/dalvikvm(279): Shared lib '/data/data/com.example.hellojni/lib/libhamsterdb-java.so' already loaded in same CL 0x44eac098 04-09 02:22:35.312: DEBUG/dalvikvm(279): Trying to load lib /data/data/com.example.hellojni/lib/libhamsterdb-java.so 0x44eac098 04-09 02:22:35.312: DEBUG/dalvikvm(279): Shared lib '/data/data/com.example.hellojni/lib/libhamsterdb-java.so' already loaded in same CL 0x44eac098 04-09 02:22:35.332: DEBUG/Db1(279): Success! 04-09 02:22:35.752: INFO/ActivityManager(59): Displayed activity com.example.hellojni/.HelloJni: 4647 ms (total 4647 ms)
"Success!"がlogcatに出力されましたか?
出たら(たぶん)正常稼働しました。おめでとうございます。
おつきあいありがとうございました。
手順メモは以上になります。質問されても答えられないので、申し訳ないですが自力で判断・解決してください。
それでは、楽しい公、いやハム、いやいやhamsterdbライフを!
履歴消しゴム 100万件ダウンロード突破
みなさん、こんばんは。
DUMAPICです。
最近特に冷え込みが激しいですね。
インフルエンザも流行しているらしいので、皆さん体に気をつけてください。
私?もちろん毎日寝落ちしてますよ。インフルエンザの格好の餌食w
で、標題の件ですが、おかげさまで、拙作Androidアプリ「履歴消しゴム(英語名:HistoryEraser)」が、
全世界トータルのダウンロード数で100万件を突破しました!
この場を借りて改めて御礼申し上げます。ありがとうございます。
昨年2010年11月24日にアプリを公開してから約14ヶ月目でなんとココまで来ました。
前にも言いましたけど某掲示板でのちょっとした発言がきっかけで公開したのですが、まさかここまで来るとは・・・自分でも信じられません。消しゴムなのにゴミ箱なのは相変わらずですがw
一応証拠写真を・・・

何気にコメントも10000件を超えていました。。。
ここまで増えた背景ですが、やはり昨年4月に機能追加した「非rooted向けのAndroidマーケット検索履歴削除機能」によるものが大きいです。
今でこそ競合アプリが出てきていますが、当時、非rootedでマーケットの検索履歴を消せるのはこれだけでした(rooted向けでは既にありましたけど)。
あと、ほぼ同時期に出したOperaBridgeというアプリ(現在は公開中止)の影響もあります。
これら2つの要因が海外で結構取り上げられて、うわーっと広がりをみせた感じです。
最近では、海外ユーザーの方がわざわざ履歴消しゴムの使い方(というより、マーケットとかの履歴が削除できるぞーという証拠映像のタッチが強いw)をYouTubeに乗せていたこともありました。そういえば、パロディの動画もアップされてましたね。
もちろん、国内のユーザーにも底堅い支持をいただいてましたよ。履歴が消せないんですけど→消しゴム使え!という感じでw
感謝です。
つまりまとめると・・・
・海外で評価をいただき、いろんなサイトで紹介してもらったこと。
・日本のユーザーから支持をいただいたこと。
・雑誌やWebにも掲載されたこと。
・OperaBridgeユーザーからの動線があったこと。
ある意味、私は幸運だったのかもしれません。
これからもよろしくお願いします。
ではでは。
DUMAPICです。
最近特に冷え込みが激しいですね。
インフルエンザも流行しているらしいので、皆さん体に気をつけてください。
私?もちろん毎日寝落ちしてますよ。インフルエンザの格好の餌食w
で、標題の件ですが、おかげさまで、拙作Androidアプリ「履歴消しゴム(英語名:HistoryEraser)」が、
全世界トータルのダウンロード数で100万件を突破しました!
この場を借りて改めて御礼申し上げます。ありがとうございます。
昨年2010年11月24日にアプリを公開してから約14ヶ月目でなんとココまで来ました。
前にも言いましたけど某掲示板でのちょっとした発言がきっかけで公開したのですが、まさかここまで来るとは・・・自分でも信じられません。消しゴムなのにゴミ箱なのは相変わらずですがw
一応証拠写真を・・・

何気にコメントも10000件を超えていました。。。
ここまで増えた背景ですが、やはり昨年4月に機能追加した「非rooted向けのAndroidマーケット検索履歴削除機能」によるものが大きいです。
今でこそ競合アプリが出てきていますが、当時、非rootedでマーケットの検索履歴を消せるのはこれだけでした(rooted向けでは既にありましたけど)。
あと、ほぼ同時期に出したOperaBridgeというアプリ(現在は公開中止)の影響もあります。
これら2つの要因が海外で結構取り上げられて、うわーっと広がりをみせた感じです。
最近では、海外ユーザーの方がわざわざ履歴消しゴムの使い方(というより、マーケットとかの履歴が削除できるぞーという証拠映像のタッチが強いw)をYouTubeに乗せていたこともありました。そういえば、パロディの動画もアップされてましたね。
もちろん、国内のユーザーにも底堅い支持をいただいてましたよ。履歴が消せないんですけど→消しゴム使え!という感じでw
感謝です。
つまりまとめると・・・
・海外で評価をいただき、いろんなサイトで紹介してもらったこと。
・日本のユーザーから支持をいただいたこと。
・雑誌やWebにも掲載されたこと。
・OperaBridgeユーザーからの動線があったこと。
ある意味、私は幸運だったのかもしれません。
これからもよろしくお願いします。
ではでは。
開発者向け話題~自前logクラスについて
どうも。連投中のDUMAPICです。
さて、今回はAndroid開発者向けの話題です。
開発者の皆さんは、Androidでのログ出力はどのような形で実装されているのでしょうか?
ちなみに私は、APIで用意されているlogのラッパークラスを用意してログ出力制御を行っています。
なんでラッパークラスなんて作るの?と思われるかもしれませんが、一応自分のアプリで散々実績?を積んだソースコードを晒します。
このクラスを用意した理由は大きく2つあります。
(1) 開発中はログをだらだらと出力したいけどリリース時は出力させたくない。しかもデバッグだのリリースだのと一々ログをコメントアウトとかしたくない。
(2) logcatのフィルタを使いたいのでタグは統一化したいけど、やっぱりどのクラスでログ出力したかも把握したい。
ということで、オレオレクラスを作ったわけです。
<使い方>
・ログの出力有無は、static変数のIS_LOGGABLEで制御します。
あえてfinalにしていないのは、デバッグモード/リリースモード判定による真偽値を注入したいけど、モード取得にはContextが必要なため、クラス初期化子による初期化ができないと判断したためです。
ちなみにこれらのモード判定はAndroidManifest.xmlのandroid:debuggableの値をみて行います。具体的なやり方は他の方が公開していますので割愛しますw
・タグはstatic変数のTAG_NAMEに設定します。未設定の場合、ログ出力したクラス名をタグとして用います。 設定した場合は、ログ本文の冒頭に出力したクラス名を出力します。
<コーディング例>
Trace.TAG_NAME = "HogeHoge";
Trace.IS_LOGGABLE = DeployUtils.isDebuggable(this.getBaseContext());
…
Trace.log(Trace.Level.DEBUG, "[START] onCreate()");
とかかな。
もっといい方法あるよとか、おかしくね?とかありましたらコメントください。
ちなみにコーディングスタイルがちょっと変則的ですがそこはご愛嬌wでお願いします。
ではでは。
さて、今回はAndroid開発者向けの話題です。
開発者の皆さんは、Androidでのログ出力はどのような形で実装されているのでしょうか?
ちなみに私は、APIで用意されているlogのラッパークラスを用意してログ出力制御を行っています。
なんでラッパークラスなんて作るの?と思われるかもしれませんが、一応自分のアプリで散々実績?を積んだソースコードを晒します。
このクラスを用意した理由は大きく2つあります。
(1) 開発中はログをだらだらと出力したいけどリリース時は出力させたくない。しかもデバッグだのリリースだのと一々ログをコメントアウトとかしたくない。
(2) logcatのフィルタを使いたいのでタグは統一化したいけど、やっぱりどのクラスでログ出力したかも把握したい。
ということで、オレオレクラスを作ったわけです。
<使い方>
・ログの出力有無は、static変数のIS_LOGGABLEで制御します。
あえてfinalにしていないのは、デバッグモード/リリースモード判定による真偽値を注入したいけど、モード取得にはContextが必要なため、クラス初期化子による初期化ができないと判断したためです。
ちなみにこれらのモード判定はAndroidManifest.xmlのandroid:debuggableの値をみて行います。具体的なやり方は他の方が公開していますので割愛しますw
・タグはstatic変数のTAG_NAMEに設定します。未設定の場合、ログ出力したクラス名をタグとして用います。 設定した場合は、ログ本文の冒頭に出力したクラス名を出力します。
<コーディング例>
Trace.TAG_NAME = "HogeHoge";
Trace.IS_LOGGABLE = DeployUtils.isDebuggable(this.getBaseContext());
…
Trace.log(Trace.Level.DEBUG, "[START] onCreate()");
とかかな。
もっといい方法あるよとか、おかしくね?とかありましたらコメントください。
ちなみにコーディングスタイルがちょっと変則的ですがそこはご愛嬌wでお願いします。
ではでは。
