「Android NDK入門/演習」サポートページ目次へ
 このサイトの目次へ

サンプル・プロジェクトから自分のプロジェクトを作る

 工学社刊/清水美樹著「Android NDK入門/演習」」( ISBN978-4-7775-1671-1/ ISBN978-4-7775-1672-8)の、著者によるサポート内容をご紹介します。
 Android NDKに添付されているサンプル・プロジェクトを、自分の作業プロジェクトとして複製したい場合、単にフォルダを複製するだけでは、そこからの生成物は元のものと同じアプリとみなされてしまいます。そこで、元のサンプル・アプリと区別できるように、アプリ作成の設定ファイルにいろいろな変更を加えます。本書で使用したサンプル「native-activity」を自分用に複製してみましょう。

同じソース・コードで、別のプロジェクトを作る

単に「フォルダを複製」ではダメなのか

 最も簡単な方法は、プロジェクトとして構築した「native-activity」フォルダを、どこか他の場所にコピーするか、名前を変えて同じ場所に置く事です。
 でも、それでは、「実行してみる」ことができるのは、どちらかひとつです。
 なぜなら、「フォルダの名前」は、Windowsのファイル・システムでの区別に過ぎないからです。このプロジェクト名(アプリ・ファイル名でもある)は「build.xml」ファイルで決まっています。パッケージ名やアプリの名前も、中の設定ファイルで決められています。ビルドしてできるのは、「同じアプリが更新された」ものです。

フォルダを複製して、かつ設定ファイルを書き換える

 そこで、フォルダを複製するのはもちろんですが、その中にある設定ファイルも書き換えていきます。
 書き換えるファイルは以下のものです。 - build.xml プロジェクト名及びアプリ・ファイル名を変更
- AndroidManifest.xml アプリのパッケージ名、使用するCライブラリ名(Android.mkの変更に合わせる)
- Android.mk main.cからできるCライブラリの名。こちらを変更してから、AndroidManifest.xmlを書き換えたほうがよい
- res/strings.xml アプリの表示名。AndroidManifest.xml中で間接的に指定された内容の具体的な値がこちらに書いてある

 「アプリのパッケージ名」とは「アプリ・フォルダ名のことじゃないのか?」と思うかも知れませんが、多くの場合、それだけではありません。Javaでいう「パッケージ」とはJava「プログラムの入っているフォルダ」を表しますが、ほとんどの場合これはアプリ・フォルダの構造に準じます。すなわち、「アプリ・ファイル」を展開すると「パッケージ・フォルダ」になるのです。これについては、我々のプロジェクトが完成してから具体的に解説しましょう。

フォルダの操作

まずはフォルダを複製

 ということで、まずは、「myndk」フォルダにある「native-activity」フォルダをその場で複製します。そして、名前を「my-native-app」にします。

図1 「native-activity」を複製して「my-native-app」にする

生成物の削除

 もとの「native-activity」フォルダには、動作確認をした際のコンパイル生成物が残っています。それらが良くない影響を与えるといけませんから、全部消してしまいます。
 消すのは、「bin」、「libs」、「obj」の三つのフォルダです。マウスで選択して、フォルダごとゴミ箱に入れてしまいます。

図2 「bin」「lib」「objs」の三つを、手作業で消す

設定ファイルの編集

バックアップファイルの自動作成に注意

これから、設定ファイルをいくつか編集しますが、エディタによっては編集によりバックアップファイルが自動作成される場合があります。
それらのバックアップファイルが、アプリのビルドに影響する場合があります。ビルドの前には、バックアップファイルは全て除去するのが無難です。

build.xmlの編集

 build.xmlを編集します。編集するのは、「内容」としては一番上、「実際に書かれている」のは上から2行目の、リスト1の部分です。

プロジェクト名が指定されています。

リスト1 build.xmlで編集する箇所
<project name="NativeActivity" default="help">

 プロジェクト名を「MyNativeApp」に変更するには、リスト1リスト2のように書き換えます。

リスト2 リスト1を編集した
<project name="MyNativeApp" default="help">

図3 プロジェクト名を書き換えたところ

これで、作成されるアプリ・ファイル名は「MyNativeApp-debug.apk」になるはずです。


Android.mkの編集

 「main.c」と一緒に「jni」フォルダの中にある「Android.mk」です。

 書き換えるのは、リスト3の部分です。これは、「ライブラリの名前」であり、具体的には「ライブラリ・ファイル名」の特定の箇所です。
 リスト3のように指定しているので、生成するライブラリ・ファイル名は「libnative-activity.so」になっています。

リスト3 Android.mkで編集する箇所
LOCAL_MODULE    := native-activity

 リスト4のように書き換えると、ライブラリ・ファイル名は「libmynativeapp.so」になるはずです。

リスト4 リスト3を編集した
LOCAL_MODULE    := mynativeapp

図4 ライブラリ名を書き換えたところ

AndroidManifest.xmlの編集

 AndroidManifest.xmlで書き換えるところは最低2カ所です。

 ひとつは、上のほうにあります。リスト5にある「パッケージ名」です。

リスト5 AndroidManifest.xmlで編集する箇所、その1
package="com.example.native_activity"

 本文書においても、アプリの「公開」までは考えない事にします。そこでパッケージ名は、やはり暫定的なものにしておきます。たとえば「my.native_app」です。
 みなさんが将来、実際に公開するアプリを作るとしたら、ここは「世界にひとつしかない」パッケージ名にする必要があります。

リスト6 リスト5を編集した。ただし、公開を考えない暫定的なもの
package="my.native_app"

図5 パッケージ名を書き換えたところ

 この「パッケージ名」は、実はインストール済みのアプリを扱う際の識別名となります。このことは最後にもう一度説明しますが、今設定した名前を覚えておきましょう。少なくとも、「AndroidManifest.xml」中の、図5の箇所にあるということは覚えておきましょう。

さて、このパッケージ名ですが、最近筆者が学んだことがあります。
パッケージ名に「native」という名前が含まれています。本書のようにNDK(やSDK)のコマンドラインでプロジェクトを操作しているうちは問題ない事項ですが、このプロジェクトをEclipseに読み込むときは、「package」というフォルダ名がパッケージ名に入っていると、Eclipseがなにかを勘違いして他の処理をしようとして、失敗するらしく、エラーになります。
本書で指定したように「native_app」なら大丈夫です。「native.app」と「ドット」で切って「独立」させるのがまずいようです。

 もうひとつは、読み込むCのライブラリ名です。本書第10-3節で調べた <metadata> タグです。

リスト7 AndroidManifest.xmlで編集する箇所、その2
 <meta-data android:name="android.app.lib_name"
                    android:value="native-activity" />

 これを書き換えるリスト8の値は、「Android.mk」でリスト4のように書き換えたのに合わせます。

リスト8  リスト7を書き換えた
 <meta-data android:name="android.app.lib_name"
                    android:value="mynativeapp" />
図6 読み込むライブラリ名を、「Android.mk」で変更したものに合わせる
なお、以下の部分は、ついつい編集したくなりますが、ここは手をつけません。
ここは手をつけない
<activity android:name="android.app.NativeActivity"
この「android.app.NativeActivity」は、ネイティブアプリにライブラリとしてバンドルされている、アプリの本体です。

 「AndroidManifest.xml」の設定はこれで終わりですが、まだ閉じないで置いてください。
まず、このファイルで「アプリ名」が間接的に指定されていることを確認しておきましょう。リスト9の<application>タグの部分です。

リスト9  アプリ名が間接的に指定されている
 <application  android:label="@string/app_name" android:hasCode="false" />

strings.xmlの編集

 リスト9が間接的に指定している内容は、「res」フォルダの中にさらにある「value」フォルダの中の「strings.xml」ファイルです。編集するのは、こちらです。

「strings.xml」のリスト10の部分が「アプリの表示名」です。

リスト10 「strings.xml」で編集する箇所
<string name="app_name">NativeActivity<string>
 アプリの表示名を「MyNativeApp」にする場合は、これをリスト11のように編集します。
リスト11 リスト10を編集した
<string name="app_name">MyNativeApp<string>

図8 アプリ名を書き換えたところ

 設定ファイルに最低限必要な編集はこれで終了です。では、開いておいた「AndroidManifest.xml」でもうひとつ、以下に示す付加的な作業をしましょう。

独自のアイコンをつける

AndroidManifest.xmlでアイコンの設定ができる

 「AndroidManifest.xml」には、実はもうひとつ、「Javaを使いたくない場合にも」設定する意義のある箇所が残っています。
 それは「アプリのアイコン」の設定です。今はまだ、設定が書かれていません。

res/drawableフォルダを作成

 アイコンを設定するとなると、プロジェクト中にアイコンファイルを置く必要があります。
 どこに置くかは、Androidによって決められています。それは、プロジェクト・フォルダ中の「res/drawable」フォルダです。
 「res」フォルダは今ちょうど「strings.xml」の編集のために、開けてみたところです。そこには、「strings.xml」が入っている「values」フォルダしかありません。
 そこで、そこに並ぶように「drawable」フォルダを自分で作成します。このフォルダ名、用語としてはあまり馴染みのあるものではありませんが、「draw」+「able」だと考えるとよいでしょう。

図8 「res」フォルダ中に「drawable」フォルダを作成

正方形の画像ファイルを配置

 図8の「drawable」フォルダ中に、アイコン用の画像ファイルを置きます。大きさはだいたい正方形で、48 -128ピクセル四方もあれば、Androidが適当なサイズに拡大/縮小してくれます。
 たとえば、図9のような「icon_mynativeapp.png」を置いてみます。

図9 適当な名前と大きさの画像ファイルを置く



AndroidManifest.xmlに追記

 このアイコンの指定は「drawable/icon_mynativeapp」と書きます。場所はリスト12の<application>タグです。
リスト12  アイコンの使用を追記する箇所
 <application android:label="@string/app_name" android:hasCode="false" />
 アイコンの指定は「属性」です。属性名は「android:icon」です。たとえばリスト13のように追記できます。
リスト13  アイコンの使用を追記する箇所
 <application android:icon="@drawable/icon_mynativeapp" android:label="@string/app_name" android:hasCode="false" />

図10 実際にリスト13を追記したところ

 これで「AndroidManifest.xml」も保存して終了できます。

変更したプロジェクトをビルド・実行

mynativeappフォルダに移動

 これからは、書き換えたフォルダ「my-native-app」中で作業しますから、まずそのフォルダに移動する必要があります。

 「コマンド・プロンプト」を操作します。もし、さっきまで「native-activity」フォルダ上で作業したままでしたら、「隣の」「my-native-app」フォルダに移動することになります。
 それには、実行例1 のように、「cd」コマンドにおける「移動先」を指定します。
 点「..」は、ひとつ上のフォルダという意味です。ひとつ上のフォルダすなわち「myndk」フォルダに一旦移動してから、別の名前のフォルダに行くので、「隣のフォルダ」に移動したことになるのです。

実行例1 隣のフォルダに移動する
cd ../my-native-app

図11 「native-activity」フォルダから隣の「my-native-app」フォルダに移動する「cd」コマンド

 もし、今改めて「myndk」フォルダから「コマンド・プロンプト」ウィンドウを起動したのであれば、「myndk」に移動した状態になっている(ように設定を書き換えた)のですから、「mynativeapp」フォルダに移動する方法は、実行例2になります。

実行例2 「myndk」フォルダのすぐ下のフォルダに移動する
cd my-native-app


プロジェクトから作り直す

 まず、「build.xml」の編集によりプロジェクト名を変更しましたから、プロジェクトを「アップデート」しましょう。実行例3のようにします。

実行例3 プロジェクトをアップデート
android update project -t 2 -p . -s

 これで「プロジェクト名」及びアプリ・ファイル名が変更されました。


libmynativeapp.soを作成

 設定ファイルの変更内容が、作業に反映されることを確かめましょう。
 図12のように、「ndk-build」コマンドで、「libmynativeapp.so」が作成されることを確かめます。

図12 「ndk-build」コマンドで作成されるライブラリ・ファイル名を確かめる

MyNativeApp-debug.apkを作成

 図13のように「ant debug」コマンドで、「MyNativeApp-debug.apk」が作成されることを確かめます。アプリ・ファイルの名前は、最後に出て来る「BUILD SUCCESSFUL」の少し上に表示されているでしょう。

図13 「ant debug」コマンドで作成されるアプリ・ファイル名を確かめる

名前の変わったアプリをインストール、動作確認

 プロジェクトの「bin 」フォルダに作成された「MyNativeApp-debug.apk」ファイルを、実行例4により起動中のエミュレータにインストールします。
実行例4 自分で名前を変更したアプリ・ファイルを、エミュレータにインストール
adb install bin/MyNativeApp-debug.apk

 正しく設定変更が行われれば、すでにインストールした「NativeActivity」の他に、「MyNativeApp」というアプリを起動できるはずです。

図14 「NativeActivity」の他にインストールされた「MyNativeApp」

 「Android NDK入門/演習」サポートページ目次へ
 このサイトの目次へ