SlideShare a Scribd company logo
js-ctypes
ネイティブコードを呼び出す新しいカタチ
共有ライブラリを
JavaScriptから呼び出す
今までは共有ライブラリの
呼び出しはできなかったの?
xptcall
JavaScriptから呼び出せる形で
  C++でコンポーネントを作成して

xptcall経由でそのコンポーネントを取得

      そこから呼び出す
面倒くさいので、コードで説明する
まず、C++側のコード
呼びたいのはこれだけ
IDLファイル
コンポーネント自体を作成する
     仕組みも
    作らなければ
JavaScript側のコード
js-ctypes - ネイティブコードを呼び出す新しいカタチ
このように
C++とJavaScriptの両方を
    書く必要がある
呼びたい関数が増えれば、
IDLファイルの変更が必要になる

     Gecko的には、
  IDLを変更した場合には
     そのinterfaceの
 UUIDを変えないといけない
js-ctypes - ネイティブコードを呼び出す新しいカタチ
しかも、MozillaのSDKが必要
C++で書かないといけないということは

   Mac OS XとWindowsの
      両方に対応する
   Extensionを書く場合は

個別に作らないといけないってこと?
ということは、

 Windowsしかもっていない場合は、
Macを買わないといけないってことか!
Mac OS Xって
PowerPCとかx86とかx86_64もあるよね?

     各CPU種類ごとにも
  ビルドする必要があるってこと?
そんな感じで

  各OS、CPU毎のバイナリを
   Extensionに入れれば

どのプラットフォームでもサポート可能
そんなことしてる例が、

Mozilla LabにWeave Syncというものが
            あってだな
Weave SyncのExtensionをバラしてみる
js-ctypes - ネイティブコードを呼び出す新しいカタチ
ちょっと共有ライブラリを
    使いたいだけでも

     いちいちC++で
コードを書かないといけないのが現状
ということは

メンドクサイ
ちょっとやることを大げさになると
        アドオンの開発が
JavaScriptで閉じなくなるのは面倒

   これはMozillaっぽくない
なら、簡単に呼び出せる方法を
   作ればよくない?

   そこでjs-ctypes
js-ctypes
●
    ネイティブコード(共有ライブラリ)を呼び出す新しい
    方法
●
    Firefox 3.6 (Gecko 1.9.2)から利用可能
●
    名前の由来は、Pythonのモジュールから
js-ctypes
●
    簡単なライブラリを呼び出すだけであれば、い
    ちいち専用コンポーネントを作成する必要が
    あった
    ●
        制限事項に引っかからない限りこれからは必要なし
●
    Chrome権限が必要なので、HTMLコンテンツ
    からは使えません
js-ctypes
●
    Mike Finkle (今モバイルやってる人) がはじめた
    プロジェクト
●
    最初はExtensionとしての実装
●
    今は、Raw JSAPI経由
●
    JavaScriptとネイティブコードのバインディングに
    は、libffiを利用
使い方

呼び出し方法は簡単
まず、ctypes.jsmをインポートして
呼びたいライブラリをロードして
関数を定義して
定義した関数を呼び出す
いらなくなったら、クローズ
シンプル!
関数定義でサポートされている型

●
  void
●
  整数 (int8 ~ int64)
●
  浮動小数点 (float、double)
●
  文字列 (ASCIIとUnicode)
ただ、自分はCore Developerなので、
    内部の話にも触れます
xptcall vs js-ctypes

は内部的にはどう違うの
xptcall
●
    Geckoでは内部でxptcallと呼ばれる機能があっ
    て、そこでJavaScriptとネイティブコードのバイン
    ディングが行われる
    ●
        各プラットフォーム毎に実装が必要
●
    xptcallからxpconnect経由でネイティブコードを呼
    び出す
●
    xptcallを利用するには、IDLが必要
js-ctypes
●
    js-ctypesがJavaScriptエンジンのAPIを直接
    呼び出す
●
    言語間バインディングはlibffiまかせ
●
    エクスポートされているものは呼び出し可能
同じようなことできるけど、
      内部的には
まったくやってること違うんですよ
ただ、悲しいお知らせもあります
現在の制限事項
●
    コールバック関数をパラメータとして渡すこと
    ができない
●
    構造体を利用することができない
●
    参照も
●
    ARM環境(MaemoとかWindows Mobileとか)は
    現在未サポート
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
何かあれば、

   Twitter: @makoto_kato
Email: m_kato@ga2.so-net.ne.jp
Any Question?

More Related Content

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