Tokyo Sky Tree

Preview:

Citation preview

東京スカイツリー~Grailsとボクと、時々、ネイティブ・ライブラリ~

2010/07/24

余談ですが

タイトルは、リリー・フランキーの小説『東京タワー ~オカンとボクと、時々、オトン~』のパクリで

す。

自己紹介

名前: 杉浦孝博twitter: @touchez_du_bois

ここから本題

Javaにない機能を使いたい時。

レガシーシステムと連携したい時。

ネイティブ・ライブラリがすでにある時。

どうしますか?

まず思い付くのは、

JNI(Java Native Inteface)

だと思います。

ですが、JNIを使う場合、

●javahでC/C++のヘッダファイルを作成●C/C++でネイティブコードを記述●ネイティブコードをコンパイルして共有ライブラリを作成

とかする必要があります。

う~ん・・・面倒(´・ω・`)

そんなあなたにオススメなのが、こちら。

JNA(Java Native Access)

JNAとは、

直接JNIを使用せずに、Javaからネイティ

ブ・ライブラリに(割と)楽にアクセス出来るライブ

ラリ

と言えます。

ネイティブ・ライブラリにアクセスするのに作成

するのは、基本的に

JavaのInterface

だけとなります。

サポートするプラットフォームも幅広く、

●Windows (x86、x86_64)●Linux (x86、x86_64)●FreeBSD / OpenBSD (x86、x86_64)●Solaris (x86、x86_64、SPARC、SPARC V9)●Mac OS X (PPC、x86、x86_64)

と、マルチプラットフォーム向けのアプリ

ケーション開発にも向いています。

では、例を見てみましょう。

数時間前に紹介されてしまいましたが、

身近なところでJNAが使われていますので、その

ソースを参考に。

それは、数時間前に上原さんと中野さんが紹介さ

れた、

GroovyServ

です。

中野さんが少し説明されましたが、

気にしない、気にしない。

まずは、ネイティブ・ライブラリのインタフェースとなるJavaのInteface

です。

import com.sun.jna.Libraryimport com.sun.jna.Nativeimport com.sun.jna.Platform

interface CLibrary extends Library { String libname = (Platform.isWindows() ? "msvcrt" : "c") CLibrary INSTANCE = Native.loadLibrary(libname, CLibrary.class) int chdir(String dir) int _chdir(String dir)}

ネイティブ・ライブラリをロードします。プラットフォームに応じてロードするライブラリ名を変えています。

String libname = (Platform.isWindows() ? "msvcrt" : "c")CLibrary INSTANCE = Native.loadLibrary(libname, CLibrary.class)

システムコールなどをマッピングします。プラットフォームごとに名前が異

なるので、別々に定義します。

int chdir(String dir) // UNIX系int _chdir(String dir) // Windows

マッピングでは、名前と型をJavaにあわせます。

// UNIX系・システムコールint chdir(const char *path);   ↓int chdir(String path);

次は、呼び出す側のソースです。

class PlatformMethods { static chdir(String dir) { if (Platform.isWindows()) { CLibrary.INSTANCE._chdir(dir) } else { CLibrary.INSTANCE.chdir(dir) } }}

プラットフォームに応じて呼び出すメソッドを変えています。

if (Platform.isWindows()) { CLibrary.INSTANCE._chdir(dir) } else { CLibrary.INSTANCE.chdir(dir) }

説明だけではアレですので、

JNAを使ったデモします。

このデモでは、以前Twitter上で

と募集したところ、

やさぐれ番長さんから

...噛みました...

やさぐれ番長@bikisukeさんから

と、ムチャぶりが、

...噛みました...

と、ムチャぶりリクエストがありましたが、

少しだけリクエストに答えたいと思います。

(デモ中)

照れるので、代わりに語ってもらいました。

大事なことなので二回語ってもらいました。

デモの説明をします。

Webブラウザからサーバに、文字列を送信しま

す。

サーバで次のことをします。

●送られてきた文字列を形態素解析し、音声記号列を生成●音声記号列から音声合成(WAV)●WAVデータをクライアントに返す

WebブラウザでWAVデータを再生

デモの構成

WebアプリGrails 1.3.3(Tomcat)

形態素解析Sen + IPA辞書

音声合成AquesTalk2

●非営利の個人利用は無償●複数のプラットフォームに対応(Windows, Linux, Mac, iPhone, Android)

WAVデータ再生Firefox + HTML5のAudioクラス

FlashとかAppletとかは使ってません。

AquesTalk2(ネイティブ・ライブラリ)の呼び出し

JNA

ちなみに「形態素解析 + 音声合成」は、Grailsプラグイン化しています。

今後は、

↓この人にも対応したいです。

と、いうわけで、まとめ的な。

Javaからネイティブ・ライブラリを使うようなこ

とがあれば、

ポインタ、ポインタのポインタ、参照渡し、構造体、共用体、関数ポインタ、などなど、いろいろ

とありますが、

JNAを検討してみてください。

以上、ご清聴ありがとうございました。

Recommended