Native Client(NaCl)をやってみる (5) - C++を使う -
今までのはC言語でやってましたが、それをC++でやってみる
sample.cc
#include <iostream>
#include <algorithm>
#include "ppapi/cpp/instance.h"
#include "ppapi/cpp/module.h"
#include "ppapi/cpp/var.h"
using namespace std;
class SampleInstance : public pp::Instance {
public:
SampleInstance(PP_Instance instance) : pp::Instance(instance) {
}
virtual ~SampleInstance() {
}
virtual bool Init(uint32_t argc, const char* argn[], const char* argv[]) {
return true;
}
virtual void HandleMessage(const pp::Var &var_message) {
if (!var_message.is_string()) {
return;
}
string str = var_message.AsString();
reverse(str.rbegin(), str.rend());
PostMessage(pp::Var(str));
}
};
class SampleModule : public pp::Module {
public:
SampleModule() : pp::Module() {
}
virtual ~SampleModule() {
}
virtual pp::Instance* CreateInstance(PP_Instance instance) {
return new SampleInstance(instance);
}
};
namespace pp {
Module* CreateModule() {
return new SampleModule();
}
}
Pepper C Interfaceとは違いPP_EXPORTをせずにppなネームスペース内にCreateModuleでpp::Moduleなクラスを返す方式な模様。んまぁあとは https://developers.google.com/native-client/dev/peppercpp を見れば良いと思うので
コンパイル
/opt/nacl/pepper_21/toolchain/linux_x86_newlib/bin/i686-nacl-g++ \
-o sample.nexe \
sample.cc \
-m32 -pthread \
-Wall \
-lppapi_cpp \
-lppapi
sample.nmf
{
"program": {
"x86-32": {
"url": "sample.nexe"
}
}
}
index.html
<html>
<body>
<input type="text" id="text" />
<button id="btn">send</button>
<embed id="nacl_module" src="/sample.nmf" type="application/x-nacl" width="0" height="0" />
<script type="text/javascript">
(function(undefined) {
var module = document.getElementById("nacl_module");
module.addEventListener("message", function(msg) {
var elm = document.createElement("h2");
elm.innerText = msg.data;
document.querySelector("body").appendChild(elm);
});
document.getElementById("btn").addEventListener("click", function() {
var text = document.getElementById("text").value;
module.postMessage(text);
});
})();
</script>
</body>
</html>