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

Я несколько раз читал учебник Google для собственного клиента о том, как создать свой собственный модуль PNaCl на основе C ++, и почему-то я не становлюсь мудрее, я знаю, что если я хочу реализовать функцию обмена сообщениями. У меня есть следующее в файле .cc в качестве основы для кода PNaCl, все это взято из учебника Google 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().

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


person TalG    schedule 28.08.2016    source источник
comment
Неужели никто не в курсе?   -  person TalG    schedule 29.08.2016


Ответы (1)


Итак, вот решение, которое заняло несколько часов:

// 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, должен написать мне комментарий, и я опубликую его.

person TalG    schedule 29.08.2016