MeCab JavaバインディングをWindowsで

めちゃくちゃ苦労したのでメモ。
形としては,Windows(Cygwin)ではライブラリとしてso形式のものが使えない(らしい)ので,dllを作成して動かすことに。
(Linux版をcygwinで動かそうとするとこれで引っかかる。)
但し本体のconfigureと辞書の生成作業でCygwinも必要。
ちなみによく分からずに進めたので間違いだらけかも。


必要なもの(末尾の括弧内は自分が試したバージョン)


インストール作業


▼MeCabライブラリのビルド
参考:twist-bend coupling: MeCabのPythonバインディングをWindowsでビルド

  • MeCab本体(mecab-0.97.tar.gz)の準備
    Cygwinでconfigure後,VC++のnmakeを利用。

    1. DLしたものを適当なところ(D:/cygwin/tmp/)に置く。
    2. 解凍~configure

      === Cygwin ===
      $ tar zxvf mecab-0.97.tar.gz
      $ cd mecab-0.97
      $ ./configure

    3. mecab-0.97/src/make.bat内の各種パス記述を修正。
      インストールしたVC++等に合わせる。
      VC++のバージョンと,ドライブレターあたりを直せば多分OK。
    4. vsvars32.bat(環境設定)を実行してからmake.batを実行。
      参考:smashonline @ ウィキ - nmake

      === DOS prompt ===
      > cd D:\\cygwin\\tmp\\mecab-0.97\\src
      > "D:\\Program Files\\Microsoft Visual Studio 9.0\\Common7\\Tools\\vsvars32.bat"
      > make.bat

      なにやら大量にwarningが出るけど大丈夫ぽい。
      srcフォルダに大量のファイルが生成される。

  • Javaバインディングの準備
    用意されてるバインディング(MeCab_wrap.cxx)だとちゃんと動かないので,SWIGを使って自分で再構築。
    それをビルドしてライブラリを生成する。

    1. DLしたものを適当な場所(D:/cygwin/tmp/)に置き,解凍。

      === Cygwin ===
      $ tar zxvf mecab-java-0.97.tar.gz

      といっても使うのは実質テスト用のtest.javaだけ。

    2. MeCab本体フォルダのmecab-0.97/src/mecab.hを編集。
      253行目「#ifndef SIWG」を「#ifndef SWIG」に。
      さらにその下も#ifndefで囲む。

      === mecab.h ===
      #ifndef SWIG
          static const char *version();
      #endif

    3. SWIG処理。
      makefileを参考に以下を実行してMeCab_wrap.cxx他を生成。

      === DOS prompt ===
      > cd D:\\cygwin\\tmp\\mecab-0.97\\swig
      > (swig解凍ディレクトリ)\\swig -java -package org.chasen.mecab -c++ MeCab.i

    4. 生成されたMeCab_wrap.cxxで,1.で解凍された同名ファイルを上書き。
    5. ビルド。MeCab_wrap.dllを生成。
      同梱のmakefileはLinux用でso形式のライブラリを生成してしまうので,以下のように手動で。

      === DOS prompt ===
      > cl /EHsc /LD /I D:\\cygwin\\tmp\\mecab-0.97\\src /I D:\\Programs\\Java\\jdk1.6.0_04\\include /I D:\\Programs\\Java\\jdk1.6.0_04\\include\\win32 MeCab_wrap.cxx D:\\cygwin\\tmp\\mecab-0.97\\src\\libmecab.lib

  • 動作確認
    とりあえず辞書やフォルダ配置はおいておいて,動くかどうかをバージョン出力で確認。

    1. SWIGでできた*.javaをmecab-java-0.97/org/chasen/mecab/内に移動(解凍で出てきているものを上書き)。
    2. mecab-java-0.97/にmecab-0.97/src/のlibmecab.dllを移動。
    3. test.javaの8行目で読み込むライブラリ名を変更。

      === test.java ===
      System.loadLibrary("MeCab_wrap");

      # もしくはMeCab_wrap.dllを「MeCab.dll」に名前変更しておけば,上記は不要。(こっちのが後々楽かも。)

    4. test.javaをコンパイル~実行。
      バージョン情報部分だけでも出力されればOK。
      (辞書設定をしていないので,以降はエラーになるはず。)

      === DOS prompt ===
      > javac -encoding utf8 test.java
      > java test
      0.97
      (以降エラー)


▼その他
以下はかなりいい加減なメモ。

  • 辞書のインストール
    実はこれちゃんとやっていなくて,以前入れてそのままだったWindows版MeCab(辞書付き)の影響で,特に設定せずとも↑のテストで動作してしまった。
    Win版インストールの時点で,レジストリに?辞書のパスが記憶されるのかも。
    (ただし文字コードの関係で文字化けしてた。)
    そこで,Linux用のIPA辞書をcygwinでconfigure(必要に応じて文字コード設定のオプションを ./configure -with-charset=utf8 とか)~makeして生成される辞書ファイル群で,Win版辞書が入っているディレクトリの中身を置き換えたところ,文字化けも解消された。
    # でも別PCではうまくいかんかった。なんでだろう・・
  • Eclipseでの利用
    必要なのはMeCab_wrap.dll, libmecab.dll, MeCab.jarの3つだけ(+辞書)。

    1. ライブラリ読み込み
      MeCab_wrap.dllとlibmecab.dllの二つを,インストール済みJREのbinディレクトリ(D:/Programs/Java/jre1.6.0_04/bin/とか)に入れる。
      これでjava.lang.UnsatisfiedLinkError: no ○○ in java.library.path / Can't find dependent librariesといったエラーは回避できるはず。
      強引なやり方。
    2. JARの読み込み
      mecab-javaディレクトリにて

      === DOS prompt ===
      > jar cfv MeCab.jar org/chasen/mecab/*.class

      で生成されるJARを,Eclipseにて「外部JARの追加」で。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)