JavaでFlash

オープンソースのFlashライブラリとして有名なMingをJava(Servlet)で利用して動的にFlashを作成します。以下はMingのバージョンが0.3、Linux、Tomcat5~での手順です。

Mingのダウンロード

こちらから以下の3つをダウンロードします。

ming-0.3.0.tar.gz
ming-java-0.3.0.tar.gz
ming-fonts-1.00.tar.gz

コンパイル

Ming本体をコンパイルします。

tar zxvf ming-0.3.0.tar.gz
tar zxvf ming-java-0.3.0.tar.gz

cd ming-0.3.0
./configure
make
su
make install

Ming Java(JNI)のコンパイル

java_extディレクトリに移動し ming-java のコンパイルを行いますが、Makefile上でJDKのパスが固定になっているため、環境に合わせて修正します。以下は例です。

#JAVADIR=/usr/java/sdk
JAVADIR=/usr/java/jdk1.5.0_09

コンパイルし、出来上がったjarファイルをwebappのWEB-INF/libにコピーします。

make
cp jswf.jar ${tomcat.webapp.dir}/WEB-INF/lib

JNIの共有ライブラリをコンパイル

java_ext/nativeディレクトリで共有ライブラリをコンパイルします。こちらもMakefileを何ヶ所か修正する必要があります。

# JAVADIR=/usr/java/sdk
JAVADIR=/usr/java/jdk1.5.0_09
 
# MINGDIR=../../src
MINGDIR=../..
 
# 追加
NOVAR_SHLIBEXT=.so

コンパイルし、出来上がったlibjswf.so をコピーします。この例ではMingライブラリと同じ /usr/local/lib へコピーします。

make
su
cp libjswf.so /usr/local/lib

Mingのフォントを展開

任意ディレクトリにMingフォントを展開します。この例では /usr/local/ming に展開します。

cd /usr/local/ming
tar zxvf ming-fonts-1.00.tar.gz

Servletを作成

ServletからFlashを作成するサンプルです。コンパイル時にはCLASSPATHに jswf.jar を含める必要があります。

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import java.io.OutputStream;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class MingTest extends HttpServlet{
 
    private static final String FONTDIR =
            "/usr/local/ming/ming-fonts-1.00/fdb";
 
    private static final String FONT =
            "Bitstream Vera Serif-B.fdb";
 
    private static final String FS =
            System.getProperty("file.separator");
 
    public void doGet(
            HttpServletRequest request,
            HttpServletResponse response)
                throws IOException, ServletException{
 
        try{
            SWFMovie movie = new SWFMovie();
 
            movie.setDimension(300, 300);
            movie.setBackground(0, 0, 0);
            movie.setRate(20);
 
            SWFFont font = new SWFFont(FONTDIR + FS + FONT);
            SWFText text = new SWFText();
            text.setFont(font);
            text.setHeight(20);
 
            text.setColor(0, 255, 0, 0);
            text.addString("Hello world");
 
            SWFDisplayItemI item = movie.add(text);
            item.move(100, 100);
            movie.nextFrame();
            for (int i=0; i < 255; i++){
                item.setAlpha(i);
                movie.nextFrame();
            }
 
            movie.add(new SWFAction("stop();"));
            movie.nextFrame();
 
            response.setContentType("application/x-shockwave-flash");
            OutputStream os = response.getOutputStream();
            os.write(movie.output());
            os.close();
        }
        catch(SWFException e){
            log("", e);
            throw new ServletException(e);
        }
    }
}

Tomcatの設定

MingのライブラリをJavaから参照可能にする必要があります。Tomcatのbinディレクトリで setenv.sh を作成し、LD_LIBRARY_PATHを設定します。setenv.sh は起動時にTomcatによって自動的に読み込まれます。

LD_LIBRARY_PATH=/usr/local/lib
export LD_LIBRARY_PATH

実行

以上で完了です。リクエストによってFlashの出力が返されます。この例は固定のFlashですが、Mingライブラリを使用すれば動的なFlashも簡単に作成できます。出力バージョンを調整すれば携帯向け Flash Lite にも(一部問題はありますが)対応できます。

注意点

JNIを使用していることもあり、ちょっとしたミスで簡単にVMがアボートしてしまいます。フォント関連やテキスト関連などで落ちやすいように見受けられます。これはMing本体の問題でなくJNIコード側の問題で、品質には問題がありそうです。

また、デフォルト状態では日本語を使用することができません。使用するためには日本語フォント(fdb)の用意と一部JNIのコード修正も必要になります。