ライブラリを作る

これからは、ライフゲームで飯を喰ってこうと思ってて、
有料のライフゲームでも作ろうかなーって思ってるんだけど、
じゃぁ、また同じソースをコピペしてプロジェクト作るのってアレなので、
無料版と有料版のプロジェクトから参照できるライブラリを作ることにした。

という訳で、既存のプロジェクトからライブラリを作成してみる。
手順はこんな感じ。

  1. ライブラリ用のプロジェクトをワークスペースに追加
  2. ライブラリ用のプロジェクトのプロパティを開く
  3. 上から2段目にある”Android”を選択
  4. “Is Library”にチェックを付ける
  5. ライブラリを参照するプロジェクトのプロパティを開く
  6. 上から2段目にある”Android”を選択
  7. “Add…”ボタンを押して、ライブラリ用のプロジェクトを追加

ここまでは、簡単、簡単。
次に、切り出したいクラスをライブラリ用のプロジェクトに引っ越しする。
この作業は、普通にファイルをカット&ペーストで移動する。
そして、引っ越し先のフォルダ構成に合わせて、
ファイルの先頭にあるパッケージ宣言を変更する。
例えば、ライブラリ用のプロジェクト名を”LifeGameLib”にしたならこんな感じ。

//package your.domain.LifeGameWallpaper; この行を下のと差し替える
package your.domain.LifeGameLib;

ライブラリを参照する側は、import句でライブラリを指定するだけ。

import your.domain.LifeGameLib;

でも、こんなエラーが出てハマった。

UnsatisfiedLinkError

たぶん、通常時はこのエラーに遭遇しない。
今回は、JNIフォルダをライブラリ用プロジェクトに引っ越したので、
このエラーに遭遇した。
幸い、StackTraceが表示されているので、どこで落ちたのか分かる。
調べてみると、Native呼び出しでエラーが起きているっぽい。
つまり、Cで書いた関数を呼ぶところで起きてるらしい。
で、どこがダメだったのかというと、
ライブラリに切り出した時に行ったパッケージ宣言の修正を、
Cの方で行っていなかったのが原因だった。

以前、「NDKを使ってみた」で書いた通り、
Cで実装する場合は、関数名にパッケージ名とクラス名を含む必要があって、
例えば、”foo”という関数をJavaから呼び出すと、
“Java_your_domain_LifeGameLib_ClassName_foo”が呼ばれるが、
この関数が存在していないためにエラーが起きていた。
“Java_your_domain_LifeGameWallpaper_ClassName_foo”の宣言と実装を、
上記の関数名に修正すると正常に動くようになった。

以上が、(JNIを含めた)ライブラリへの切り出し手順。
ちなみに、今回のネタ元はこの本から。

実は、まだ大切な作業が残っていて、
ライブラリ用のプロジェクトを作ると要らないファイルも作成されるので、
不要なファイル、及び記述は削除する必要がある。
ライブラリを作ると、ライブラリのリソースも参照することが出来るが、
ライブラリを参照するプロジェクトに影響を与えたくない場合は、
ライブラリ用のプロジェクトで、以下のような作業を行う必要がある。

  • (存在する場合は、)Activityファイルを削除
  • “res”フォルダの中身を削除
  • “AndroidManifest.xml”の中から、”application”タグを削除

おしまい。

Leave a Comment