Emscripten のチュートリアルでは、C 関数と対話する方法について適切に説明されています: https://github.com/kripken/emscripten/wiki/Interacting-with-code
しかし、C++ クラスとどのようにやり取りしますか。
- コンストラクターを呼び出してオブジェクトを作成する
- オブジェクトを削除する
- クラスとそのメソッドのデッド コードの削除を防ぐ
Emscripten のチュートリアルでは、C 関数と対話する方法について適切に説明されています: https://github.com/kripken/emscripten/wiki/Interacting-with-code
しかし、C++ クラスとどのようにやり取りしますか。
私がこれを行った方法は、必要な操作を行う「プロキシ」関数を作成することでした。例えば:
class HelloWorld
{
int x;
public:
HelloWorld() { x = 0; }
~HelloWorld() {}
void setX(int v) { x = v; }
int getX() { return x; }
// ...
};
//compile using "C" linkage to avoid name obfuscation
extern "C" {
//constructor, returns a pointer to the HelloWorld object
void *HW_constructor() {
return new HelloWorld();
}
void HW_setX(HelloWorld *hw, int x) {
hw->setX(x);
}
int HW_getX(HelloWorld *hw) {
return hw->getX();
}
void HW_destructor(HelloWorld *hw) {
delete hw;
}
};
次に、JS で、プロキシ関数を呼び出すオブジェクトのクローンを作成する必要があります (面倒なことはわかっていますが、現時点ではより良い解決策を知りません)。
// get references to the exposed proxy functions
var HW_constructor = Module.cwrap('HW_constructor', 'number', []);
var HW_destructor = Module.cwrap('HW_destructor', null, ['number']);
var HW_setX = Module.cwrap('HW_setX', null, ['number', 'number']);
var HW_getX = Module.cwrap('HW_getX', 'number', ['number']);
function HelloWorld() {
this.ptr = HW_constructor();
}
HelloWorld.prototype.destroy = function () {
HW_destructor(this.ptr);
};
HelloWorld.prototype.setX = function (x) {
HW_setX(this.ptr, x);
};
HelloWorld.prototype.getX = function () {
return HW_getX(this.ptr);
};
重要これを機能させるには、次のフラグを emcc コマンドに追加して、プロキシ メソッドをデッド コードとして削除しないように指示する必要があることに注意してください (注: ここのアンダースコアは意図的で重要です!)。
emcc helloworld.cpp -o helloworld.js \
-s EXPORTED_FUNCTIONS="['_HW_constructor','_HW_destructor','_HW_setX','_HW_getX']"
編集:コードを試すための要点を作成しました。