google nativeclient — интеграция старого кода C ++ в модуль PNaCl

Я несколько раз читал учебник по работе с нативным клиентом Google о том, как создать свой собственный модуль PNaCl на основе C ++, и почему-то я не становлюсь мудрее, я знаю, что если я хочу реализовать функцию обмена сообщениями. У меня есть следующее в файле .cc в качестве основы для кода PNaCl, все это взято из учебника Googles’s Hello World:

#include "ppapi/cpp/instance.h"#include "ppapi/cpp/module.h"#include "ppapi/cpp/var_array.h"#include "ppapi/cpp/var.h"
namespace {
// The expected string sent by the browser.
const char* const kHelloString = "hello";
// The string sent back to the browser upon receipt of a message
// containing "hello".
const char* const kReplyString = "hello from NaCl";
} // namespace

class job1Instance : public pp::Instance {
public:
explicit job1Instance(PP_Instance instance): pp::Instance(instance) {}
virtual ~job1Instance() {}

virtual void HandleMessage(const pp::Var& message) {
if (!message.is_string()) {
return;
}
std::string message_txt = message.AsString();
pp::Var reply;
if (message_txt == kHelloString) {
reply = pp::Var(kReplyString);
PostMessage(kReplyString);
}
}
};

class job1 : public pp::Module {
public:
job1() : pp::Module() {}
virtual ~job1() {}

virtual pp::Instance* CreateInstance(PP_Instance instance) {
return new job1Instance(instance);
}
};

namespace pp {

Module* CreateModule() {
return new job1();
}
}  // namespace pp

Как я понимаю, модули PNaCl не используют функцию main (), и все же, скажем, у меня есть старый код C ++, который создает 2 массива unsorted1 а также unsorted2 со случайными числами, которые я хочу использовать в моем модуле PNaCl:

#include <iostream>
#include <stdint.h>
#include <unistd.h>
#include <array>

// a function to create a random number between min and max
int32_t rangeRandomAlg (int32_t min, int32_t max) {
int32_t num = max - min + 1;
int32_t remainder = RAND_MAX % num;
int32_t x;
do {
x = rand();
} while (x >= RAND_MAX - remainder);
return min + x % num;
}

// a function to create arrays with random numbers
void unsortedArrays(int32_t unsorted1[], int32_t unsorted2[],int32_t arrayElements, int32_t minNum, int32_t maxNum){
for(int32_t i = 0; i <= arrayElements; i++) {
if (i < arrayElements/2) {
unsorted1[i] = rangeRandomAlg(minNum, maxNum);
} else {
unsorted2[i] = rangeRandomAlg(minNum, maxNum);
}
}
}

// the main function
int32_t main(int32_t argc, char *argv[]) {
// declare all the zises
int32_t minNum = 0;
int32_t maxNum = 100;
int32_t arrayElements = maxNum;

// the arrays
int32_t unsorted1[arrayElements/2];
int32_t unsorted2[arrayElements/2];

// fill the arrays with random numbers
unsortedArrays(unsorted1, unsorted2, arrayElements, minNum, maxNum);

return 0;
}

Моя проблема в том, что я не совсем понял, как я могу интегрировать этот код в модуль PNaCl и использовать HandleMessage() функция для отправки unsorted1 а также unsorted2 массивы обратно к JavaScript с PostMesage() функция. Я знаю, что я должен работать с массивами, а не строки в HandleMessage() функция.

Я надеюсь получить некоторую помощь здесь, так как я действительно новичок во всем этом родном клиенте.

2

Решение

Ну вот решение, которое заняло несколько часов, чтобы добраться до:

// pepper includes
#include "ppapi/cpp/instance.h"#include "ppapi/cpp/module.h"#include "ppapi/cpp/var_array.h"#include "ppapi/cpp/var.h"#include "json/json.h"#include <sstream>

// cpp includes
#include <stdint.h>
#include <unistd.h>
#include <array>
#include <string>

//static variables
namespace {
// The expected string sent by the browser.
const char* const kHelloString = "Bereit fuer dein Modul";
// The string sent back to the browser upon receipt of a message
// containing "hello".
const char* const kReplyString = "PNaCl hat Ergebnisse geschickt";
} // namespace

class job1Instance : public pp::Instance {
public:
explicit job1Instance(PP_Instance instance): pp::Instance(instance) {}
virtual ~job1Instance() {}

virtual void HandleMessage(const pp::Var& message) {
/*
if (!message.is_string()) {
return;
}
std::string message_txt = message.AsString();
pp::Var reply;
if (message_txt == kHelloString) {
reply = pp::Var(kReplyString);
PostMessage(kReplyString);
}
*/

/*** my functions and data for the cpp code to integrate start here ***/
// declare all the zises
int32_t minNum = 0;
int32_t maxNum = 100;
int32_t arrayElements = maxNum;

// the arrays
int32_t unsorted1[arrayElements/2];
int32_t unsorted2[arrayElements/2];

// fill the arrays with random numbers
unsortedArrays(unsorted1, unsorted2, arrayElements, minNum, maxNum);
std::string outRes1, outRes2;
arrayToString(unsorted1, arrayElements/2, outRes1);
arrayToString(unsorted2, arrayElements/2, outRes2);
PostMessage(outRes1); // send the unsorted1 array as a string to the JavaScript back
}

private:
// function to create a random number between min and max
int32_t rangeRandomAlg (int32_t min, int32_t max) {
int32_t num = max - min + 1;
int32_t remainder = RAND_MAX % num;
int32_t x;
do {
x = rand();
} while (x >= RAND_MAX - remainder);
return min + x % num;
}

// function to create arrays with random numbers
void unsortedArrays (int32_t unsorted1[], int32_t unsorted2[],int32_t arrayElements, int32_t minNum, int32_t maxNum) {
for(int32_t i = 0; i <= arrayElements; i++) {
if (i < arrayElements/2) {
unsorted1[i] = rangeRandomAlg(minNum, maxNum);
} else {
unsorted2[i] = rangeRandomAlg(minNum, maxNum);
}
}
}

// convert the arrays to string
void arrayToString (int32_t array[], int32_t arraySize, std::string& arrayString) {
for (int32_t i = 0; i <= arraySize; ++i){
arrayString+= std::to_string(array[i]);
if (i != arraySize) {
arrayString+= ',';
}
}
}
};
/*** my functions and data for the cpp code to integrate end here ***/class job1 : public pp::Module {
public:
job1() : pp::Module() {}
virtual ~job1() {}

virtual pp::Instance* CreateInstance(PP_Instance instance) {
return new job1Instance(instance);
}
};

namespace pp {

Module* CreateModule() {
return new job1();
}
}  // namespace pp

Это только предварительно скомпилированный код C ++ модуля PNaCl с моим встроенным кодом, он отправляет только outRes1 переменная = unsorted1 переменная массива в виде строки для кода JavaScript в файле index.html. Вы должны иметь файлы .nmf и index.html, написанные отдельно. Если кто-то хочет увидеть мой код этих файлов, который имеет основной и рабочий код для этого модуля PNaCl, напишите мне комментарий, и я опубликую его.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]