2

在我的 HTML
中,假设我有 2 个输入字段,值为 3 和 4:

<form onchange="reload()">
  <h2>Input:</h2>
  <input type="number" id="val1" name="val1" value="3">
  <input type="number" id="val2" name="val2" value="4">
  <br><br>
  <h2>Output</h2>
  <input type="text" id="out" name="out" value="untouched by C++"><br>
</form>

在我的 JavaScript 中
,我得到这两个值并将它们推送到一个数组中,如下所示:

Module = document.getElementById('module');
var msg = [];
msg.push(Number(document.getElementById('val1').value));
msg.push(Number(document.getElementById('val2').value));

然后我将它发送到我的 C++ 文件以处理消息

Module.postMessage(msg);

在我的 C++ 文件中[这里是我卡住的地方。]
我必须处理消息的代码如下

virtual void HandleMessage(const pp::Var& var_message) {
  std::string message = var_message.AsString();
  pp::Var var_reply = pp::Var(message);
  PostMessage(var_reply);
}

问题是它处理一个字符串[如果我的msg是数组类型,它实际上会崩溃]。

我希望它期待和接受的是一个数组或一个对象
基本上,是这样的:

virtual void HandleMessage(const pp::Var& var_message) {
  pp::Var var_reply =  var_message[0] + var_messgae[1]; // I expect this to be 3+4=7
  PostMessage(var_reply);
}

有人可以帮我弄清楚如何在我的 C++ 中从 JavaScript 中获取数组或对象,以便我可以一起计算值并将结果发送回 JavaScript?

4

3 回答 3

1

我已经解决了我遇到的问题。最好的方法是使用一个对象并将值作为 JSON 对象传递,所以

在 JavaScript 中

values = {
        "val1": Number(document.getElementById('val1').value),
        "val2": Number(document.getElementById('val2').value)
    };
msg = JSON.stringify(values);
Module.postMessage(msg);

然后处理消息并将响应发送回 JavaScript

在 C++ 中:

在标头中,您需要添加picoJSON来处理 JSON 和sstream以使用isstringstream

#include <sstream>
#include "picojson.h"
using namespace std;

然后在代码中:

virtual void HandleMessage(const pp::Var& var_message) {

        picojson::value v;

        // pass the message that was sent from JavaScript as a string
        // var_message.AsString() will be in form "{\"val1\":4,\"val2\":4}");
        // and convert it to istringstream

        istringstream iss2((string)var_message.AsString());

        // parse iss2 and extract the values val1 and val2
        string err = picojson::parse(v, iss2);

        int val1 = (int)v.get("val1").get<double>();
        int val2 = (int)v.get("val2").get<double>();

        // finally send the message and you'll see the sum in the JavaScript
        PostMessage( val1 + val2 );

  }
于 2013-07-29T11:05:20.593 回答
1

文档还没有更新,但是pepper_29现在有一个pp::VarArray访问数组的接口。

您可以在此处查看新 C++ 接口的头文件。

以下是如何使用它(未经测试):

virtual void HandleMessage(const pp::Var& var_message) {
  if (!var_message.is_array()) return;

  pp::VarArray array(var_message);

  // Do some stuff with the array...
  uint32_t length = array.GetLength();
  double sum = 0;
  for (uint32_t i = 0; i < length; ++i) {
     pp::Var element = array.Get(i);
     if (element.is_number()) {
       sum += element.AsDouble();
     }
  }

  pp::Var var_reply(sum);
  PostMessage(var_reply);
}
于 2013-10-22T20:37:42.410 回答
0

我有同样的问题,我想发送一个字符串数组

var nativeArray = new Array();
nativeArray[0] = "Item 1"
nativeArray[1] = "Item 2"
naclModuleElement.postMessage(nativeArray)

并且在 HandleMessage 中没有调用任何内容

发送nativeArray.length作品并在 NaCl 侧显示“2”

经过一番调查,我看到课堂上没有AsArray()功能pp::Var

只有原语可用

有一个类pp:VarArrayBuffer可用于发送/接收二进制信息..可能会有所帮助(虽然没有下载其中发布的示例)

于 2013-07-27T19:59:34.857 回答