Google Native Client SDK スタブアプリケーショの中身を見よう
[Step 6: Review the code in the stub application.]
スタブアプリケーションの中身を見てみましょう
というわけでずらずら見ていくようです。よし、どんどん教えてくれ(他力本願)
MakefileはNaClモジュールを実行可能形式(.nexe)にしてくれますよ。ってまんまだな。
NaCl SDKはCライブラリの実装の違いから、newlibとglibcって二種類のGCCベースのtoolchains(コンパイラみたいなもん?)があるけど、
この Makefile は newlib toolchanを使ってビルドしてるらしい。
make についての情報はGNUを見ろと。
まぁいいやスルー。
hello_tutorial.nmf
hello_tutorial.nmfはマニフェストファイルだそう。glibcを使ってコンパイルするときはアプリケーションが使う共通ライブラリを明記する必要があるとかなんとか…なるほどわからん。
hello_tutorial.html
hello_tutorial.html はアプリケーションと通信するWebページで、モジュールを読むために<embed>要素を持ちますと。
↓な感じらしい
<div id="listener">
<script type="text/javascript">
var listener = document.getElementById('listener');
listener.addEventListener('load', moduleDidLoad, true);
listener.addEventListener('message', handleMessage, true);
</script>
<embed name="nacl_module"
id="hello_tutorial"
width=0 height=0
src="hello_tutorial.nmf"
type="application/x-nacl" />
</div>
<embed>のパラメータについて
src はNaClマニフェストファイルの指定で、ブラウザが.nexeファイルをユーザ環境の命令セット上に読み出すために使う…のか?
width, height は、この例ではグラフィックコンポーネントを使ってないので0に指定。
type はMIMEタイプを x-nacl と宣言してるとか…とりあえず実行可能なNaClモジュールのこと指してるのか?
明記されてないけどnameとidはそのままHTMLの他のタグと一緒だろう。
<embed>は<div>に囲まれてるけど、これは2つのイベントリスナーを持ってる?とか?
一つはブラウザがNaClモジュールを正常に読み込んだときに発行される"load"イベント、
もう一つは"message"イベントで、 NaClモジュールが(pp::Instanceクラスの中の) PostMessage()メソッドを使って
アプリケーション内のJavaScriptコードにメッセージ送るときに発行されるものらしい。
このように<embed>の親タグとして<div>を置き、イベントリスナーをくっつける方法で
"load"イベントが発行される前にイベントリスナーがアクティブになることを保証している。らしい。
なんで保証するかとかは…わからん。
このチュートリアル中の単純なイベントハンドラは moduleDidLoad() と handleMessage() の2つのJavaScript関数で実装されてるそうだ。
moduleDidLoad() は<div>タグの 'status_field' を変更します。
handleMessage() はNaClモジュールから送られたメッセージをブラウザのアラートパネルに表示します。
load, message及びその他のNaClイベントはデベロッパーズガイドのProgressEventsで説明されてる、らしいです。
hello_tutorial.cc
NaClにはモジュールとインスタンスという概念があります。(らしいです)
モジュール(module)は実行可能形式である.nexeファイルにコンパイルされたCまたはC++コードのこと。
インスタンス(instance)はモジュールによって管理されるWebページの矩形?です?矩形って…?
インスタンスがビジュアルコンポーネントを持たないWebページならその矩形の値は 0×0。
インスタンスは<embed>タグを含むWebページによって生成される。
複数の<embed>タグを使ってモジュールを参照するようなWebページではモジュールは予めモジュールがインクルードされているかもしれない?ん?わからん。とにかく、このような場合NaCl実行システムモジュールを一度呼び、モジュールによって管理される複数のインスタンスを生成する。
チュートリアル中の例では hello_tutorial_x86_32.nexe または hello_tutorial_x86_64.nexe というユーザのマシンの
アーキテクチャに頼ったモジュールのどちらかを使っている。また同様に一つのインスタンス(モジュールを読み込む一つの<embed>タグ)を使う。
モジュール用のソースコードはhello_tutorial.ccにある。このソースコードはC++ NaClモジュールが要求する最低限のコード、
つまりInstanceとModule2つのクラスの実装がされている。これらの実装は実際にはまだ何もしない。
…ってしないの!?
なにやらこのチャプター難しくてよくわからんかったな…間違い多いかも。
とりま今日はここまで…