Native Client(NaCl)をやってみる (5) - C++を使う -

2012-08-27T00:00:00+00:00 C++ JavaScript Native Client

今までのは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>

Google API Client Library for JavaScriptを使ってAnalytics APIに接続するメモ Native Client(NaCl)をやってみる (4) - dlopen(dlfcn.h)を使う -