呼び出すCの関数は、単純で簡単なdoublenumber.c。
/* doublenumber.c */ #includeint 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 件のコメント:
コメントを投稿