平日SE 日曜PG (仮)

SEもどきが趣味のプログラムを勉強した履歴なんかを書いたり書かなかったり

Google Native Client SDK スタブアプリケーショの中身を見よう

[Step 6: Review the code in the stub application.]

 

スタブアプリケーションの中身を見てみましょう

 

というわけでずらずら見ていくようです。よし、どんどん教えてくれ(他力本願)

 

 

Makefile

 

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つのクラスの実装がされている。これらの実装は実際にはまだ何もしない。

…ってしないの!?

 

 

なにやらこのチャプター難しくてよくわからんかったな…間違い多いかも。

とりま今日はここまで…