node.jsのいろいろなモジュール6 – NodObjCでObjective-Cを呼び出す

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

node.jsでObjective-Cを呼び出す

今回ご紹介するモジュールは、node.jsからObjective-Cを呼び出すためのモジュール、NodObjC ※1です。
このモジュールは動的にObjective-CのフレームワークからAPIを生成するためにBridgeSupportファイルを使用します。
この仕組はJsCocoaやRubyCocoaなど、他の一般的なObjetive-CのScripting Bridge ※2とよく似ています。
Scripting BridgeはMacOSX10.5から導入されたもので Objective-Cの文法を使いアプリケーションを操作できる仕組みです。

NodObjCは内部で、Objective-Cのランタイムとやり取りするために、node-ffi ※3というモジュールを使用しています。
このモジュールはJavaScriptで動的ライブラリをロードして呼び出すためのnode.jsのアドオンです。
node-ffiを使用すると、C++コードを記述することなくネイティブライブラリへのバインディングが可能になります。

インストール

今回使用した動作環境は以下のとおりです。

  • OS : MacOS X 10.7.1
  • Node.js : v0.4.11
  • npm : 1.0.30
  • NodObjC : 0.0.7

ではnpmを使用してインストールしましょう。

% npm install NodObjC

Note:
もしNodOjbCのインストールで失敗する場合、node-ffiのビルドに失敗している可能性があります。
その場合は

% export CXXFLAGS=-I$(node -e 'require("path").dirname(process.execPath)')/../include

を実行してからインストールしてみてください。
また、下記サイトも参考になるかもしれないので、確認してみてください。
http://d.hatena.ne.jp/sy-2010/20110926/1317051937

インストールできたらnpmコマンドで確認します。

%npm list
/path/your/app
└─┬ NodObjC@0.0.7 
  ├── node-ffi@0.3.0 
  └── sax@0.1.5 

インストールできたので、サンプルを動かしてみましょう。

サンプルを動かしてみる

ではgithub上にもあるHello Worldを実行してみましょう。
app.jsという名前でファイルを作成し、下記コードを入力してみてください。

var $ = require('NodObjC');

// First you need to "import" the Framework
$.import('Foundation');

// Setup the recommended NSAutoreleasePool instance
var pool = $.NSAutoreleasePool('alloc')('init');

// NSStrings and JavaScript Strings are distinct objects, you must create an
// NSString from a JS String when an Objective-C class method requires one.
var string = $.NSString('stringWithUTF8String', 'Hello Objective-C World!');

// Print out the contents (calling [string description])
console.log(string);
//   → Prints "Hello Objective-C World!"

pool('drain');

実行してみましょう。

% node app.js

実行すると、コンソール上にメッセージが表示されます。
一見ふつうのコンソール出力にみえますが、Objective-Cのライブラリをimportし、 NSStringオブジェクトを作成してそのメソッドを呼び出しています。
さらに、NSAutoreleasePoolを使用して、リソースの自動解放も行なっています。

ではもうひとつCocoa GUIウィンドウを表示するサンプルです。

var $ = require('NodObjC');
$.import('Foundation');
$.import('Cocoa');

var pool = $.NSAutoreleasePool('alloc')('init');

var app = $.NSApplication('sharedApplication');
var style = $.NSClosableWindowMask | $.NSResizableWindowMask
          | $.NSTexturedBackgroundWindowMask | $.NSTitledWindowMask
          | $.NSMiniaturizableWindowMask;

var rect = $.NSMakeRect(50, 50, 600, 400);
var win = $.NSWindow('alloc')('initWithContentRect', rect
                            , 'styleMask', style
                            , 'backing', $.NSBackingStoreBuffered
                            , 'defer', 0);
win('makeKeyAndOrderFront', win);
app('run');

pool('release');

このプログラムを実行すると、シンプルなウィンドウが表示されます。

まとめ

今回はnode.jsを介してObjective-Cを呼び出すためのモジュールをご紹介しました。
JavaScriptでObjective-Cをラップして、インターフェイスをhtmlで作成することもできそうですね。
用途は限られるかもしれませんが、試してみてください。

参考サイトなど