Emacs+JDEEでAndroid開発 ~環境構築~

Posted by hiroki.kana on July 15, 2010
このエントリーをはてなブックマークに追加

Android搭載の携帯(HTC Desire)を買ったからには、アプリの開発を行いたいということで今までは情報の多いEclipseを使っていました。
Eclipse、便利な面も非常に多いのですが私は普段Emacsで全部済ませるタイプなので、いろいろストレスがたまります。

コマンドライン+Emacsで開発する方法は多く紹介されているので問題ないのですが、ソースコード補完やimportの自動化などについては情報が少なくて見当たらなかったです。
というわけで、Emacsでソースコード補完やimportの自動化などを行えるような環境構築方法。
今回使用した環境は、Mac OS X 10.6 Snow Leopard上のCarbon Emacs(22.3.1)です。

  • CEDETのインストール

まず、CEDETをインストールします。
CEDETはEmacs上でIDEのような機能を実現するためのものらしく、JDEEでも使用しているようです。
ちなみに、CEDETを使用しない場合はeieio、speedbar、Semantic Bovinatorというのを個別にインストールすればOKなようです。(※未確認)

Carbon EmacsではCEDETをネットワークインストールすることができます。
Help→Carbon Emacs Package→Net-Install→Cedetをクリックし、インストールします。

  • JDEEのインストール

sourceforgeのサイト(http://jdee.sourceforge.net/)からJDEEとelibをダウンロード(http://sourceforge.net/projects/jdee/files/)してきます。
今回はjdee-bin-2.4.0.1とelib-1.0を使用しました。

ダウンロードしてきたら、解凍し適当な場所(私は.emacs.d/lisp以下に置きました)に展開します。
その際、フォルダ名をjdeとelibに変更しておきました。
展開したら、.emacsに下記を追加します。

    (add-to-list 'load-path "~/.emacs.d/lisp/elib")
(add-to-list 'load-path "~/.emacs.d/lisp/jdee/lisp")

;; JDEE
(load "cedet")
(setenv "JAVA_HOME" "/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home")
(require 'jde)
(custom-set-variables
 '(jde-global-classpath (quote (
                                "/Applications/android-sdk/platforms/android-4/android.jar"
                                "/Applications/android-sdk/platforms/android-6/android.jar"
                                "/Applications/android-sdk/platforms/android-7/android.jar"
                                ))))

/Applications/android-sdkはAndroid SDKが配置されているディレクトリです。
これを追加することでAndroidに関するクラスのソースコード補完などの機能が使えるようになります。

  • jde.elを修正

このままだとtools jarファイルがないって怒られて動作しません。
MacのCarbonEmacsにJDEEを入れる:さむしんぐにゅぅ」を参考にjde.elのソースコードを修正します。
その後、念のため.elcファイルを消去します。(私の環境だと消さないと動作しませんでした)

  • つかってみる

では早速使ってみます。
例えば下記のようなソースをEmacsで編集します。

    package com.hirokikana.android.hello;

public class HelloTest extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    public boolean onCreateOptionsMenu(Menu menu)
    {
        // メニューを追加
        super.onCreateOptionsMenu(menu);
        MenuItem SettingMenu = menu.add(0, 0, 0, "setting");
        SettingMenu.setIcon(android.R.drawable.ic_menu_preferences);
        return true;
    }

    public boolean onOptionsItemSelected(MenuItem item)
    {
        switch (item.getItemId()) {
        case 0:
            Intent intent = new Intent();
            intent.setClassName(getPackageName(), getClass.getPackage().getName()+".Setting");
            startActivity(intent);
            return true;
        }
        return false;
    }
}

この状態で、C-c C-v zを押すと、必要なものがimportされます。
上記コードの場合、MenuとMenuItemがawtのものとandroidのもので同一の名前があるためどちらをimportするか選択できます。

適当なクラスの後ろでC-c C-v C-.を押すと補完候補の一覧が表示されます。

これは便利なんですが、Carbon Emacsの場合マウスで操作しなきゃいけないのがだいぶめんどいです。
たぶんターミナルから使うEmacsならキーボードで選択できると思います。

あと、C-c C-v C-lするとprintlnが出ます。
使ってないですけど(笑)。

ひとまず、Emacs大好きな私としてはEmacsで自動importが使えてソースコード補完ができれば大満足です。というか最高です。
さらばEclipse。

このエントリーをはてなブックマークに追加