View
1.457
Download
1
Category
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