Node Webkit から ネイティブDLLを呼ぶサンプル

# Node-Webkit Sample with Native DLL

ネイティブDLLを呼び出す、[node-webkit](https://github.com/rogerwang/node-webkit)のサンプルを公開しました。

https://github.com/essa/nw_native_dll_sample

node-webkitは、クロスプラットフォームなGUIアプリを開発するには大変優秀なフレームワークだと思いますが、Native APIを呼ぶには、ちょっと注意が必要です。

node.jsには [node-ffi](https://github.com/rbranson/node-ffi) という、JavaScript コードから Native DLL を呼ぶモジュールがあって、node-webkitでも同じように使えるのですが、node-ffiを違う方法でコンパイルしないと、node-webkitから呼び出すことはできません。

これは、その方法を確認するためのサンプルです。

* generator-node-webkit によって作成された、node-webkit用の Skelton code を使っています
* 同じJSコードが Win/Mac で動作して [Native  DLL ( *.dylib, *.DLL ) を呼び出しています](https://github.com/essa/nw_native_dll_sample/blob/master/app/js/index.js) 
* DLLのコードは同じ [API](https://github.com/essa/nw_native_dll_sample/blob/master/dlls/macosx/sample1.h) に従って、プラットフォームごとに個別に作成しています

# 注: 32bitバージョンについて

きちんと理解してないのですが、node-webkit から呼び出せるのは(あるバージョンまでは)32bit のDLLに限定されているようです。(最近、この問題が解決されたとの情報もありましたが、未確認です)

なので、以下の説明では、node.js の 32bitバージョンを利用することを前提としています。

# 使用法

## on Mac

### node.js cli で DLLの動作確認

node.js [32bit version](http://nodejs.org/dist/v0.10.26/node-v0.10.26-darwin-x86.tar.gz) を [Download page of nodejs.org ](http://nodejs.org/download/) からインストールします。

NODE_PATH 環境変数を設定します。

    $ export NODE_PATH=/usr/local/lib/node_modules

[node-ffi](https://github.com/rbranson/node-ffi) と [ref](https://github.com/TooTallNate/ref) をインストールします。

    $ npm install -g ffi
    $ npm install -g ref

sample1.dll をコンパイルして、 node.js cli で動作確認します。

    $ git clone https://github.com/essa/nw_native_dll_sample.git
    $ cd nw_native_dll_sample
    $ cd dlls/macosx
    $ make
    node ../test_sample.js
    # 以下のメッセージが表示されればうまく行っています。
    <Buffer@0x22591c0 05 00 00 00 01 00 00 00 6d 61 63 00 00 00 00 00 00 00 00 00 00 00 00 00>
    { sum: 5, difference: 1, platform: 'mac' }

ソースは[nw_native_dll_sample/dlls](https://github.com/essa/nw_native_dll_sample/tree/master/dlls) にあります。

### node-webkit で サンプルアプリを実行

node-webkit と grunt-cli をインストールします。

    $ npm install -g nodewebkit grunt-cli nw-gyp

node-ffi を(node-webkit用に)インストールします。

    $ grunt shell:install_ref shell:install_ffi

この二つのタスクは、以下のようなコマンドを実行し、node-webkit用の形式でモジュールをコンパイルします。

    $ rm -rf ffi
    $ npm install ffi
    $ cd node_modules/ffi
    $ nw-gyp rebuild --target=0.8.5'

注) nw-gyp によってコンパイルされたモジュールは、node.js とは互換性がありません。もし、再度、cli から実行する場合には、 node_modules/ffi と node_modules/ref を削除してインストールしなおしてください。

アプリを起動します。

    $ nodewebkit app

こんな画面が表示されます。

![Screen Shot on Mac](https://raw.github.com/essa/nw_native_dll_sample/master/screenshots/nw_dll_mac.png)

アプリのソースは [app/js/index.js](https://github.com/essa/nw_native_dll_sample/blob/master/app/js/index.js) にあります。

## on Windows

### 必要なパッケージ

このサンプルを動作させるには、以下のパッケージが必要になります。

* Visual Studio 2013 express
* MinGW (Base, Msys and C++ Compiler)
* Python 2.7.X
* node.js [32bit version](http://nodejs.org/dist/v0.10.26/node-v0.10.26-x86.msi) from [Download page of nodejs.org ](http://nodejs.org/download/).

### node.js cli で DLLの動作確認

    $ git clone https://github.com/essa/nw_native_dll_sample.git
    $ cd nw_native_dll_sample
    $ npm install ffi ref
    $ cd nw_dll_sample/windows
    $ make  
    <Buffer@0x2a2fb98 05 00 00 00 01 00 00 00 77 69 6e 64 6f 77 73 00 00 00 00 00 00 00 00 00>
    { sum: 5, difference: 1, platform: 'windows' }

### node-webkit で サンプルアプリを実行

    $ npm install -g nodewebkit grunt-cli nw-gyp
    $ grunt shell:install_ref shell:install_ffi
    $ nodewebkit app

こんな画面が表示されます。

![Screen Shot on Windows](https://raw.github.com/essa/nw_native_dll_sample/master/screenshots/nw_dll_win.png)

The source is [app/js/index.js](https://github.com/essa/nw_native_dll_sample/blob/master/app/js/index.js)

## on Linux

作成中

## スケルトンコードを自分で生成するには

Install node-webkit and yeoman generator

    $ npm install -g nodewebkit yo generator-node-webkit
    $ yo node-webkit

Then copy Gruntfile.js, app/js/index.js, dlls/* from this repository and modify them.