2013年

10月

11日

2年ぶりにAndroidプログラミングをやってみただけ

Androidのネタで何かやってみたくなり、久しぶりにAndroid開発に手を出してみることに。

 

しかし2年ぶりなので私の開発環境は古く、環境を一新する作業から始めましたが当時とは色々と変わっていて設定に手間取りました。今回は現時点で(なるべく)最新の開発環境の構築とAndroidプロジェクトの作成方法をメモ代わりにまとめておこうと思います。

 

項目:

開発環境を整える

●Java SDK

 

Oracleのサイトから最新のJava SDK(JDK)をダウンロードしてインストールしましょう。

インストールは手順どおりにそのまま進めば出来るはずです。

http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html

 

インストールが終わったら、環境変数に「JAVA_HOME」という変数を追加し、Path変数にもJavaの実行ファイルがあるディレクトリパスを追加します。

 

JAVA_HOME = JDKをインストールしたディレクトリ (例)C:\Java\jdk1.7\

Pathに追加 → %JAVA_HOME%bin (例)C:\Java\jdk1.7\bin

 

これでコマンドプロンクトで「java -version」と実行してJDKのバージョンが表示されればJDKのインストールは終了です。

 

ちなみに私は最新版のJDKをインストールしようとしたところインストール中にエラーが発生しまして、仕方なく古いバージョンのSDKを使用しています。

●Eclipse

 

Eclipseの最新版はコチラからダウンロードできます。

2013/10/11時点で最新版は「Eclipse 4.3.1 Kepler」です。

 

 

また、Mergedoc Projectから日本語化されたEclipseを入手できます。

今回はコチラの「Eclipse 4.3.1 Kepler 32bit Java Full Edition」を使用します。

 

zipファイルのダウンロードが始まるので、ダウンロードが終わったら任意のディレクトリで解凍してeclipse.exeを起動しましょう。

 

次にAndroid開発用のプラグインをインストールします。

Eclipseのメニューから「ヘルプ」→「新規ソフトウェアのインストール」を選択。

 

追加ボタンを押してAndroidプラグインの名前とロケーションを入力します。

ローケションには「https://dl-ssl.google.com/android/eclipse/」と入力します。

 

認識されるとAndroidの開発ツールとNDKプラグインが出てきます。

全てにチェックを入れてインストールしましょう。

 

次に、Android NDK開発用にC/C++の開発プラグインをインストールします。

Android NDKを使用しない場合はここの作業は必要ありません。

 

「新規ソフトウェアのインストール」を選択。

作業対象から「Kepler - http://download.eclipse.org/releases/kepler」を選び、「プログラミング言語」から以下の3つを選択してインストールしましょう。

●Android SDK

 

最新版のSDKはコチラからダウンロードできます。

画面中央にある「DOWNLOAD FOR OTHER PLATFORMS」をクリックし、「SDK Tools Only」からお使いの環境にあったSDKをダウンロードしてください。

 

ダウンロードしたら解凍し、任意のディレクトリに配置。配置後、環境変数のPathにAndroid SDKの「platform-tools」と「tools」のパスを追加しましょう。

 

再びEclipseへ。

「ウィンドウ」→「設定」から「Android」を選択し、「SDK ロケーション」に解凍したSDKフォルダのパスを入力します。パスが正しく認識されると「Android SDK マネージャー」と「Android 仮想デバイスマネージャー」がEclipse上で使用できるようになります。

●Android SDK ライブラリ

 

Android SDKマネージャーを起動すると、現在使用可能なAndroidライブラリの一覧が出てきます。開発に必要なライブラリにだけチェックを入れてインストールしましょう。

 

よく分からなければすべてにチェックを入れちゃって大丈夫です。

 

「Install packages」を押すとチェックを入れたライブラリのダウンロードとインストールが始まります(少々時間が掛かります)。

●Android NDK


最新版のNDKはコチラからダウンロードできます。

ダウンロードしたら解凍して任意のディレクトリに配置。SDKと同じフォルダに纏めておくと分かりやすいです。

 

環境変数のPathにNDKフォルダのパス(ndk-buildがあるフォルダパス)を追加。

 

再びEclipseへ。

「ウィンドウ」→「設定」→「Android」→「NDK」を選択し、「NDK ロケーション」に解凍したNDKフォルダのパスを入力しましょう。

 

私が開発をしてたころはndkのビルドに「cygwin」が必要だったのですが、最近はEclipseと連動できるようになり「cygwin」も必要なくなったそうです。便利になりましたねぇ・・・

Androidアプリのデバッグ環境

自作のAndroidアプリをデバッグする方法は幾つかあります。

 

・実機のAndroid端末を利用する

Android端末を持っている人限定の方法ですが、これが一番安定していると思います。

 

・Android SDKのエミュレータを利用する

エミュレータがデフォルトで搭載されていますが、一度使った事ある人なら分かると思いますが非常に動作が重いです。重すぎてデバッグどころではありません。

 

・Android OS の仮想環境を利用する

VirtualBox等でAndroidの仮想環境を作り、そこでデバッグします。

そこそこ速いです。

 

・Android SDKの高速エミュレータを利用する

x86 CPUのAndroidエミュレータを使ってデバッグが行えます。

Android SDKライブラリからダウンロード可能ですが、この機能はvt-xに対応したIntel製CPUのPCでしか使えません。

 

私の環境はAMD製のCPUなので残念ながら高速エミュレータは使用できません・・・

大人しく実機でデバッグすることにします。

 

高速エミュレータを使ってみたい方はコチラのサイトを参考にしてみてください。

Android SDK の高速エミュレータ、使ってますか?

VT-Xに対応してるか確認する方法

 

実機でデバッグする場合は実機の「USBデバッグ」を有効にし、「提供元不明のアプリ」のインストールを許可するようにしておきましょう。あとはそれぞれの端末のドライバをPCにインストールしておきましょう。

HelloWorld SDK編

画面に「Hello World」と表示するだけの簡単なアプリを作りましょう。

 

「ファイル」→「新規」→「プロジェクト」を選択、Androidアプリケーション・プロジェクトを選び「次へ」を押します。

 

アプリケーションとパッケージ名を入力し、SDKのAPIレベルを選択します。

今回私のAndroid端末のSDKバージョンに合わせてAPI8(SDK2.2)にしました。

 

特に設定をいじることなく「次へ」ボタンを押し続け、アクティビティの名前設定。

ここも特に変更せずに「完了」ボタンを押せばプロジェクトファイルが作成されます。

 

早速作成されたプロジェクトを実行してみましょう。Eclipseの「デバッグ」又は「実行」ボタンを押すと端末にアプリケーションがインストールされ、アプリが実行されます。

 

デフォルトだと実行結果はこのようになります。

 

アクティビティのソースはこのようになってます。

レイアウトで設定した内容をアクティビティに追加して描画しています。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
package com.androidproject;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}

 

次に自分のオリジナルビュークラスを作ってみましょう。

背景は青、文字色は白で「Call MyView. Hello World!」と表示するソースです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package com.androidproject;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;

public class MyView extends View {

        Paint paint;
        
        /**
        * コンストラクタ
        * @param context
        */
        public MyView(Context context){
                super(context);
                
                // 背景色
                setBackgroundColor(Color.argb(255, 0,  128, 255));
                
                // ペイントクラス作成
                paint = new Paint();
                
                // 文字サイズを30に
                paint.setTextSize(30);
                
                // 文字色を白に
                paint.setColor(Color.WHITE);
                
                // アンチエイリアスを有効に
                paint.setAntiAlias(true); 
        }
        
        @Override 
        protected void onDraw(Canvas canvas) {
                
                // 文字列描画
                canvas.drawText("Call MyView. Hello World!", 48, 48, paint);
        }
}

実行結果

HelloWorld NDK編

まずはプロジェクトのネイティブコード(NDK)を使えるようにしましょう。

プロジェクトを右クリックし、「Android ツール」から「Add Native Support」を選択。

 

新規のNDKライブラリの名前入力を求められます。

このライブラリ名はAndroidアプリと同じ名前でもかまいません。

 

「完了」ボタンを押すと、プロジェクト直下に「jni」ファイルが追加されます。

ファイルの中には「Android.mk」と「NDKライブラリ名.cpp」があります。

 

このcppファイルがNDKでのメインソースになります。NDKで使用するソースの追加削除、ライブラリ名の変更は「Android.mk」ファイルで設定できます。

 

次にネイティブコードをJavaから呼び出すクラスと関数を別途用意します。

NDKから文字列を受け取って描画するようにします。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
package com.androidproject;

public class NativeCall {

        // NDLライブラリの読み込み
        static {
                
                // NDKライブラリ名を指定
                System.loadLibrary("AndroidNativeProject");
        }
        
        /**
        * ハローワールド
        * アクセス修飾子の後にnativeを付ける
        * @return
        */
        public native String getHelloWorld();
}

 

javahを呼び出してこのコードからヘッダーファイルを作ります。

コマンドプロンクトでアプリケーションフォルダの直下に移動し、以下のように入力

 

javah -o ヘッダー出力先 -classpath bin/classes ネイティブ化するJavaクラス

 

正常に動作すればjniフォルダ下に「NativeCall.hpp」が作成されます。

 

ネイティブでの関数名は「Java_クラス名(パッケージ含む)_javaでの関数名」になります。

以下 NativeCall.hppの中身

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_androidproject_NativeCall */

#ifndef _Included_com_androidproject_NativeCall
#define _Included_com_androidproject_NativeCall
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_androidproject_NativeCall
 * Method:    getHelloWorld
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_androidproject_NativeCall_getHelloWorld
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

 

この状態だと「jni.hがドコにあるのか分からない」とエラーが出るのでプロジェクトにNDKインクルードディレクトリの参照先を追加します。

 

プロジェクトのプロパティから「C/C++ 一般」→「パスおよびシンボル」

 

Android NDKディレクトリから「platforms\android-APIレベル-arch-arm\usr\」にあるincludeフォルダを追加します。APIレベルは開発するプロジェクトのSDKバージョンとあわせます。今回はSDK 2.2なので「android-8」フォルダのものを使用します。

 

これでjni.hのエラーは出なくなります。

 

最後にNativeCall.hppの関数の中身を作りましょう。

ActiveNativeProject.cppでNativeCall.hppをインクルードして関数を実装します。

1
2
3
4
5
6
7
8
#include <jni.h>
#include "NativeCall.hpp"

JNIEXPORT jstring JNICALL Java_com_androidproject_NativeCall_getHelloWorld
  (JNIEnv *env, jobject obj) {

        return env->NewStringUTF("Call Native Code. Hello World!");
}

 

ビルドすると「ndk-build」が走ります。無事ビルドが終わったらNDKの準備は終了です。

最後にJava側でこの関数を呼び出して文字列を描画してみます。

 

実行結果

結構早足で書いたのですがいかがだったでしょうか?

あとで見返して分かりづらいところがあったら後々修正しておきます。

 

あと幾つかやりたいことがあるのでAndroidネタは暫く続きます。次は以前にやった「OpenGLで文字列描画」の一部修正版、あとAndroid NDKでのファイル読み込みをやる予定です。