Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

js-ctypes - ネイティブコードを呼び出す新しいカタチ

5,592 views

Published on

This is the presentation for js-ctypes at Firefox Developers Conference 2009 Tokyo. But this is Japanese prensetation.

Published in: Technology
  • Be the first to comment

js-ctypes - ネイティブコードを呼び出す新しいカタチ

  1. 1. js-ctypes ネイティブコードを呼び出す新しいカタチ
  2. 2. 共有ライブラリを JavaScriptから呼び出す
  3. 3. 今までは共有ライブラリの 呼び出しはできなかったの?
  4. 4. xptcall
  5. 5. JavaScriptから呼び出せる形で C++でコンポーネントを作成して xptcall経由でそのコンポーネントを取得 そこから呼び出す
  6. 6. 面倒くさいので、コードで説明する
  7. 7. まず、C++側のコード
  8. 8. 呼びたいのはこれだけ
  9. 9. IDLファイル
  10. 10. コンポーネント自体を作成する 仕組みも 作らなければ
  11. 11. JavaScript側のコード
  12. 12. このように C++とJavaScriptの両方を 書く必要がある
  13. 13. 呼びたい関数が増えれば、 IDLファイルの変更が必要になる Gecko的には、 IDLを変更した場合には そのinterfaceの UUIDを変えないといけない
  14. 14. しかも、MozillaのSDKが必要
  15. 15. C++で書かないといけないということは Mac OS XとWindowsの 両方に対応する Extensionを書く場合は 個別に作らないといけないってこと?
  16. 16. ということは、 Windowsしかもっていない場合は、 Macを買わないといけないってことか!
  17. 17. Mac OS Xって PowerPCとかx86とかx86_64もあるよね? 各CPU種類ごとにも ビルドする必要があるってこと?
  18. 18. そんな感じで 各OS、CPU毎のバイナリを Extensionに入れれば どのプラットフォームでもサポート可能
  19. 19. そんなことしてる例が、 Mozilla LabにWeave Syncというものが あってだな
  20. 20. Weave SyncのExtensionをバラしてみる
  21. 21. ちょっと共有ライブラリを 使いたいだけでも いちいちC++で コードを書かないといけないのが現状
  22. 22. ということは メンドクサイ
  23. 23. ちょっとやることを大げさになると アドオンの開発が JavaScriptで閉じなくなるのは面倒 これはMozillaっぽくない
  24. 24. なら、簡単に呼び出せる方法を 作ればよくない? そこでjs-ctypes
  25. 25. js-ctypes ● ネイティブコード(共有ライブラリ)を呼び出す新しい 方法 ● Firefox 3.6 (Gecko 1.9.2)から利用可能 ● 名前の由来は、Pythonのモジュールから
  26. 26. js-ctypes ● 簡単なライブラリを呼び出すだけであれば、い ちいち専用コンポーネントを作成する必要が あった ● 制限事項に引っかからない限りこれからは必要なし ● Chrome権限が必要なので、HTMLコンテンツ からは使えません
  27. 27. js-ctypes ● Mike Finkle (今モバイルやってる人) がはじめた プロジェクト ● 最初はExtensionとしての実装 ● 今は、Raw JSAPI経由 ● JavaScriptとネイティブコードのバインディングに は、libffiを利用
  28. 28. 使い方 呼び出し方法は簡単
  29. 29. まず、ctypes.jsmをインポートして
  30. 30. 呼びたいライブラリをロードして
  31. 31. 関数を定義して
  32. 32. 定義した関数を呼び出す
  33. 33. いらなくなったら、クローズ
  34. 34. シンプル!
  35. 35. 関数定義でサポートされている型 ● void ● 整数 (int8 ~ int64) ● 浮動小数点 (float、double) ● 文字列 (ASCIIとUnicode)
  36. 36. ただ、自分はCore Developerなので、 内部の話にも触れます
  37. 37. xptcall vs js-ctypes は内部的にはどう違うの
  38. 38. xptcall ● Geckoでは内部でxptcallと呼ばれる機能があっ て、そこでJavaScriptとネイティブコードのバイン ディングが行われる ● 各プラットフォーム毎に実装が必要 ● xptcallからxpconnect経由でネイティブコードを呼 び出す ● xptcallを利用するには、IDLが必要
  39. 39. js-ctypes ● js-ctypesがJavaScriptエンジンのAPIを直接 呼び出す ● 言語間バインディングはlibffiまかせ ● エクスポートされているものは呼び出し可能
  40. 40. 同じようなことできるけど、 内部的には まったくやってること違うんですよ
  41. 41. ただ、悲しいお知らせもあります
  42. 42. 現在の制限事項 ● コールバック関数をパラメータとして渡すこと ができない ● 構造体を利用することができない ● 参照も ● ARM環境(MaemoとかWindows Mobileとか)は 現在未サポート
  43. 43. Reference ● Mike's blog (about js-ctypes implementation) http://starkravingfinkle.org/blog/2007/09/hello-js- ctypes-goodbye-binary-components/ ● ctypes.jsm https://developer.mozilla.org/en/JavaScript_code_mo dules/ctypes.jsm
  44. 44. 何かあれば、 Twitter: @makoto_kato Email: m_kato@ga2.so-net.ne.jp
  45. 45. Any Question?

×