2016年12月16日金曜日

PharoのUnifiedFFIを使ってみた

Pharo5.0からCの共有ライブラリを呼び出す方法が簡単になったということで、 「Pharo UnifiedFFI」で検索してみたところ、確かにわかりやすいかも。 Windowsでも呼び出せるか、試してみた。システムブラウザで見てみると、UnifiedFFIというパッケージがすでにありました。

呼び出すCの関数は、単純で簡単なdoublenumber.c。

/* doublenumber.c */
#include 
int doublenumber(int n)
{
    return n * 2;
}

WindowsのMinGW gccで共有ライブラリとしてコンパイル/リンクしmylib.soを作成しました。

gcc -shared -o mylib.so doublenumber.c

作成されたmylib.soをPharo.exeと同じフォルダに配置しました。

ここから、Pharoを起動して呼び出すためのクラスを追加します。

まず、FFILibraryを継承したクラスMyTestLibを作成して、3つのメソッドを追加します。

macModuleName
unixModudleName
win32ModuleName

それぞれのメソッドは、各プラットフォームにおけるライブラリのファイル名を返すようにします。 ですからメソッドwin32ModuleNameは、作成した共有ファイル名を返すようにしました。
win32ModuleName
    ^ 'mylib.so'

次に、Objectを継承して関数呼び出しを行うためのクラスMyTestLibCallを作成しました。 このクラスに、doubleNumber:メソッドを追加しました。 このメソッドで外部関数を呼び出します。

doubleNumber: anInteger
    ^ self ffiCall: #( int doublenumber (int anInteger)) module: MyTestLib 

ffiCall:キーワードには、Cの関数の型、関数名、引数を指示する配列を指定します。
module:キーワードには、先に作成したクラスMyTestLibを指定します。

実際に、MyTestLibCallクラスのインスタンスを生成して、メソッドを呼び出してみます。

MyTestLibCall new doubleNumber: 5

これをPrint Itすると10が表示され、無事に呼び出しされているようです。

0 件のコメント: